This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.
Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.
### packages ----------
library("tidyverse")
[37m── [1mAttaching packages[22m ────────────────────────────── tidyverse 1.2.1 ──[39m
[37m[32m✔[37m [34mggplot2[37m 3.0.0 [32m✔[37m [34mpurrr [37m 0.2.5
[32m✔[37m [34mtibble [37m 1.4.2 [32m✔[37m [34mdplyr [37m 0.7.6
[32m✔[37m [34mtidyr [37m 0.8.0 [32m✔[37m [34mstringr[37m 1.3.1
[32m✔[37m [34mreadr [37m 1.1.1 [32m✔[37m [34mforcats[37m 0.3.0[39m
[37m── [1mConflicts[22m ───────────────────────────────── tidyverse_conflicts() ──
[31m✖[37m [34mdplyr[37m::[32mfilter()[37m masks [34mstats[37m::filter()
[31m✖[37m [34mdplyr[37m::[32mlag()[37m masks [34mstats[37m::lag()[39m
library("stringr")
dataset_PROSPERO2_final<-dataset_PROSPERO2_final %>%
mutate(Topic_gral=recode(Topic, c("cancer" = "Cancer")))
Error in mutate_impl(.data, dots) :
Evaluation error: Argument 2 must be named, not unnamed.
#### extraer CRDs del campo Citation con regex
prosperoID<-"[C][R][D]([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])"
dataset_raw$crds<-str_extract(dataset_raw$Citation, prosperoID)
curated_dataset<-read.csv(file="dataset_PROSPERO2_final.csv")
Error in read.table(file = file, header = header, sep = sep, quote = quote, :
more columns than column names


#### Collaborative Countries
#### no parece muy diferente al plot con unique!!!! :-(
collaborative_curated_dataset_and_tools<-curated_dataset_and_tools %>%
#filter(., unique_country=="unique") %>%
filter(., tool!="No") %>%
filter(., new_unitofanalysis!="No") %>%
filter(., measure!="BMJ Critical Appraisal Tools") %>%
filter(., measure!="CEBM Critical Appraisal Tools") %>%
filter(., measure!="JBI Critical Appraisal Tools") %>%
filter(., measure!="SIGN...SIGN.50 Critical Appraisal Tools")
collaborative_curated_dataset_and_tools<-collaborative_curated_dataset_and_tools %>%
mutate(new_unitofanalysis = fct_relevel(new_unitofanalysis, "Critical Appraisal of Clinical Practice Guidelines", "Critical Appraisal of Systematic Reviews", "Diagnostic Accuracy Studies","Economic Evaluation Studies","Health education and health behavior research studies", "RCTs", "Non-RCTs and Observational Studies", "RCTs and Observational Studies", "Quantitative Research (Public Health Research)", "Qualitative research studies", "Patient-Reported Outcome Measures Studies", "Mixed methods studies", "Medical education","BMJ Critical Appraisal Tools" ,"CEBM Critical Appraisal Tools","JBI Critical Appraisal Tools","SIGN...SIGN.50 Critical Appraisal Tools"))
Unknown levels in `f`: Health education and health behavior research studies, Quantitative Research (Public Health Research)
ggplot(na.omit(collaborative_curated_dataset_and_tools[,c(1,3:6,13,14,21,24,25)]),aes(x=Topics_general,y=tool, fill=new_unitofanalysis, color=new_unitofanalysis, shape=measure, alpha=Freq_topics)) +
geom_count(aes(x=Topics_general,y=tool, fill=new_unitofanalysis, color=new_unitofanalysis, shape=measure,alpha=Freq_topics))+
scale_shape(name = "Assessment objective")+
scale_shape_manual(values=c(24,21,22,25))+
coord_flip()+
theme(axis.text.y=element_text(angle=0, size=6))+
theme(axis.text.x=element_text(angle=90, size=6, hjust=1))+
facet_wrap(~measure)+
theme(legend.position="none")
Scale for 'shape' is already present. Adding another scale for 'shape', which will replace the existing scale.

#### barplots
#### topic X measure AND unitOfAnalisys
#### UNIQUE COUNTRIES
unique_curated_dataset_and_tools<-curated_dataset_and_tools %>%
filter(., unique_country=="unique") %>%
filter(., tool!="No") %>%
filter(., new_unitofanalysis!="No") %>%
filter(., measure!="Diagnostic Accuracy") %>%
filter(., measure!="BMJ Critical Appraisal Tools") %>%
filter(., measure!="CEBM Critical Appraisal Tools") %>%
filter(., measure!="JBI Critical Appraisal Tools") %>%
filter(., measure!="SIGN...SIGN.50 Critical Appraisal Tools")
unique_curated_dataset_and_tools<-unique_curated_dataset_and_tools %>%
mutate(new_unitofanalysis = fct_relevel(new_unitofanalysis, "Critical Appraisal of Clinical Practice Guidelines", "Critical Appraisal of Systematic Reviews", "Diagnostic Accuracy Studies","Economic Evaluation Studies","Health education and health behavior research studies", "RCTs", "Non-RCTs and Observational Studies", "RCTs and Observational Studies", "Quantitative Research (Public Health Research)", "Qualitative research studies", "Patient-Reported Outcome Measures Studies", "Mixed methods studies", "Medical education","BMJ Critical Appraisal Tools" ,"CEBM Critical Appraisal Tools","JBI Critical Appraisal Tools","SIGN...SIGN.50 Critical Appraisal Tools"))
Unknown levels in `f`: Health education and health behavior research studies, Quantitative Research (Public Health Research)
ggplot(na.omit(unique_curated_dataset_and_tools[,c(1,3:6,13,14,21,24,25)]),aes(x=Topics_general,fill=new_unitofanalysis, color=new_unitofanalysis, alpha=Freq_topics)) +
geom_bar(stat='count', aes(x=Topics_general,fill=new_unitofanalysis, color=new_unitofanalysis, alpha=Freq_topics))+
scale_color_manual(values=c("#838B8B", "#C1CDCD", "#F0E68C", "#FF8C00", "#1874CD", "#00BFFF", "#458B74", "#66CDAA", "#B4EEB4", "#8B7355", "#CDAA7D", "#FFD39B", "#F5F5DC"))+
scale_fill_manual(values=c("#838B8B", "#C1CDCD", "#F0E68C", "#FF8C00", "#1874CD", "#00BFFF", "#458B74", "#66CDAA", "#B4EEB4", "#8B7355", "#CDAA7D", "#FFD39B", "#F5F5DC"))+
coord_flip()+
theme(axis.text.x=element_text(size=6))+
theme(axis.text.y=element_text(size=10))+
facet_wrap(~measure)+
theme(legend.position="none")

#### COLLABORATIVE COUNTRIES
# unique_curated_dataset_and_tools<-curated_dataset_and_tools %>%
collaborative_curated_dataset_and_tools<-curated_dataset_and_tools %>%
filter(str_detect(PROSPERO_country, ',')) %>%
filter(., tool!="No") %>%
filter(., new_unitofanalysis!="No") %>%
filter(., measure!="Diagnostic Accuracy") %>%
filter(., measure!="BMJ Critical Appraisal Tools") %>%
filter(., measure!="CEBM Critical Appraisal Tools") %>%
filter(., measure!="JBI Critical Appraisal Tools") %>%
filter(., measure!="SIGN...SIGN.50 Critical Appraisal Tools")
collaborative_curated_dataset_and_tools<-collaborative_curated_dataset_and_tools %>%
mutate(new_unitofanalysis = fct_relevel(new_unitofanalysis, "Critical Appraisal of Clinical Practice Guidelines", "Critical Appraisal of Systematic Reviews", "Diagnostic Accuracy Studies","Economic Evaluation Studies","Health education and health behavior research studies", "RCTs", "Non-RCTs and Observational Studies", "RCTs and Observational Studies", "Quantitative Research (Public Health Research)", "Qualitative research studies", "Patient-Reported Outcome Measures Studies", "Mixed methods studies", "Medical education","BMJ Critical Appraisal Tools" ,"CEBM Critical Appraisal Tools","JBI Critical Appraisal Tools","SIGN...SIGN.50 Critical Appraisal Tools"))
Unknown levels in `f`: Health education and health behavior research studies, Quantitative Research (Public Health Research)
ggplot(na.omit(collaborative_curated_dataset_and_tools[,c(1,3:6,13,14,21,24,25)]),aes(x=Topics_general,fill=new_unitofanalysis, color=new_unitofanalysis, alpha=Freq_topics)) +
geom_bar(stat='count', aes(x=Topics_general,fill=new_unitofanalysis, color=new_unitofanalysis, alpha=Freq_topics, drop = FALSE))+
scale_color_manual(values=c("#838B8B", "#C1CDCD", "#F0E68C", "#FF8C00", "#1874CD", "#00BFFF", "#458B74", "#66CDAA", "#B4EEB4", "#8B7355", "#CDAA7D", "#FFD39B", "#F5F5DC"))+
scale_fill_manual(values=c("#838B8B", "#C1CDCD", "#F0E68C", "#FF8C00", "#1874CD", "#00BFFF", "#458B74", "#66CDAA", "#B4EEB4", "#8B7355", "#CDAA7D", "#FFD39B", "#F5F5DC"))+
coord_flip()+
scale_y_continuous(limits = c(0, 500))+
theme(axis.text.x=element_text(size=6))+
theme(axis.text.y=element_text(size=10))+
facet_wrap(~measure)+
theme(legend.position="none")
Ignoring unknown aesthetics: drop


#### barplots
#### topic X measure AND unitOfAnalisys
#### UNIQUE COUNTRIES
unique_curated_dataset_and_tools<-curated_dataset_and_tools %>%
filter(., unique_country=="unique") %>%
filter(., tool!="No") %>%
filter(., new_unitofanalysis!="No") %>%
filter(., measure!="Diagnostic Accuracy") %>%
filter(., measure!="BMJ Critical Appraisal Tools") %>%
filter(., measure!="CEBM Critical Appraisal Tools") %>%
filter(., measure!="JBI Critical Appraisal Tools") %>%
filter(., measure!="SIGN...SIGN.50 Critical Appraisal Tools")
unique_curated_dataset_and_tools<-unique_curated_dataset_and_tools %>%
mutate(new_unitofanalysis = fct_relevel(new_unitofanalysis, "Critical Appraisal of Clinical Practice Guidelines", "Critical Appraisal of Systematic Reviews", "Diagnostic Accuracy Studies","Economic Evaluation Studies","Health education and health behavior research studies", "RCTs", "Non-RCTs and Observational Studies", "RCTs and Observational Studies", "Quantitative Research (Public Health Research)", "Qualitative research studies", "Patient-Reported Outcome Measures Studies", "Mixed methods studies", "Medical education","BMJ Critical Appraisal Tools" ,"CEBM Critical Appraisal Tools","JBI Critical Appraisal Tools","SIGN...SIGN.50 Critical Appraisal Tools"))
Unknown levels in `f`: Health education and health behavior research studies, Quantitative Research (Public Health Research)
ggplot(na.omit(unique_curated_dataset_and_tools[,c(1,3:6,13,14,21,24,25)]),aes(x=as.factor(ALL_year),fill=new_unitofanalysis, color=new_unitofanalysis, alpha=Freq_topics)) +
geom_bar(stat='count', aes(x=as.factor(ALL_year),fill=new_unitofanalysis, color=new_unitofanalysis, alpha=Freq_topics))+
scale_color_manual(values=c("#838B8B", "#C1CDCD", "#F0E68C", "#FF8C00", "#1874CD", "#00BFFF", "#458B74", "#66CDAA", "#B4EEB4", "#8B7355", "#CDAA7D", "#FFD39B", "#F5F5DC"))+
scale_fill_manual(values=c("#838B8B", "#C1CDCD", "#F0E68C", "#FF8C00", "#1874CD", "#00BFFF", "#458B74", "#66CDAA", "#B4EEB4", "#8B7355", "#CDAA7D", "#FFD39B", "#F5F5DC"))+
#coord_flip()+
theme(axis.text.x=element_text(size=6))+
theme(axis.text.y=element_text(size=6))+
scale_x_discrete(labels = c("2011", "2012", "2013", "2014", "2015", "2016", "2017"))+
facet_wrap(~measure)+
theme(legend.position="none")

#### COLLABORATIVE COUNTRIES
# unique_curated_dataset_and_tools<-curated_dataset_and_tools %>%
collaborative_curated_dataset_and_tools<-curated_dataset_and_tools %>%
filter(str_detect(PROSPERO_country, ',')) %>%
filter(., tool!="No") %>%
filter(., new_unitofanalysis!="No") %>%
filter(., measure!="Diagnostic Accuracy") %>%
filter(., measure!="BMJ Critical Appraisal Tools") %>%
filter(., measure!="CEBM Critical Appraisal Tools") %>%
filter(., measure!="JBI Critical Appraisal Tools") %>%
filter(., measure!="SIGN...SIGN.50 Critical Appraisal Tools")
collaborative_curated_dataset_and_tools<-collaborative_curated_dataset_and_tools %>%
mutate(new_unitofanalysis = fct_relevel(new_unitofanalysis, "Critical Appraisal of Clinical Practice Guidelines", "Critical Appraisal of Systematic Reviews", "Diagnostic Accuracy Studies","Economic Evaluation Studies","Health education and health behavior research studies", "RCTs", "Non-RCTs and Observational Studies", "RCTs and Observational Studies", "Quantitative Research (Public Health Research)", "Qualitative research studies", "Patient-Reported Outcome Measures Studies", "Mixed methods studies", "Medical education","BMJ Critical Appraisal Tools" ,"CEBM Critical Appraisal Tools","JBI Critical Appraisal Tools","SIGN...SIGN.50 Critical Appraisal Tools"))
Unknown levels in `f`: Health education and health behavior research studies, Quantitative Research (Public Health Research)
ggplot(na.omit(collaborative_curated_dataset_and_tools[,c(1,3:6,13,14,21,24,25)]),aes(x=as.factor(ALL_year),fill=new_unitofanalysis, color=new_unitofanalysis, alpha=Freq_topics)) +
geom_bar(stat='count', aes(x=as.factor(ALL_year),fill=new_unitofanalysis, color=new_unitofanalysis, alpha=Freq_topics))+
scale_color_manual(values=c("#838B8B", "#C1CDCD", "#F0E68C", "#FF8C00", "#1874CD", "#00BFFF", "#458B74", "#66CDAA", "#B4EEB4", "#8B7355", "#CDAA7D", "#FFD39B", "#F5F5DC"))+
scale_fill_manual(values=c("#838B8B", "#C1CDCD", "#F0E68C", "#FF8C00", "#1874CD", "#00BFFF", "#458B74", "#66CDAA", "#B4EEB4", "#8B7355", "#CDAA7D", "#FFD39B", "#F5F5DC"))+
#coord_flip()+
theme(axis.text.x=element_text(size=6))+
theme(axis.text.y=element_text(size=6))+
scale_x_discrete(labels = c("2011", "2012", "2013", "2014", "2015", "2016", "2017"))+
facet_wrap(~measure)+
theme(legend.position="none")

#### barplots
#### topic X measure AND unitOfAnalisys
#### UNIQUE COUNTRIES
unique_curated_dataset_and_tools<-curated_dataset_and_tools %>%
filter(., unique_country=="unique") %>%
filter(., tool!="No") %>%
filter(., new_unitofanalysis!="No") %>%
filter(., measure!="Diagnostic Accuracy") %>%
filter(., measure!="BMJ Critical Appraisal Tools") %>%
filter(., measure!="CEBM Critical Appraisal Tools") %>%
filter(., measure!="JBI Critical Appraisal Tools") %>%
filter(., measure!="SIGN...SIGN.50 Critical Appraisal Tools")
unique_curated_dataset_and_tools<-unique_curated_dataset_and_tools %>%
mutate(new_unitofanalysis = fct_relevel(new_unitofanalysis, "Critical Appraisal of Clinical Practice Guidelines", "Critical Appraisal of Systematic Reviews", "Diagnostic Accuracy Studies","Economic Evaluation Studies","Health education and health behavior research studies", "RCTs", "Non-RCTs and Observational Studies", "RCTs and Observational Studies", "Quantitative Research (Public Health Research)", "Qualitative research studies", "Patient-Reported Outcome Measures Studies", "Mixed methods studies", "Medical education","BMJ Critical Appraisal Tools" ,"CEBM Critical Appraisal Tools","JBI Critical Appraisal Tools","SIGN...SIGN.50 Critical Appraisal Tools"))
ggplot(na.omit(unique_curated_dataset_and_tools[,c(1,3:6,13,14,21,24,25)]),aes(x=measure,fill=new_unitofanalysis, color=new_unitofanalysis, alpha=Freq_topics)) +
geom_bar(stat='count', aes(x=measure,fill=new_unitofanalysis, color=new_unitofanalysis, alpha=Freq_topics))+
scale_color_manual(values=c("#838B8B", "#C1CDCD", "#F0E68C", "#FF8C00", "#1874CD", "#00BFFF", "#458B74", "#66CDAA", "#B4EEB4", "#8B7355", "#CDAA7D", "#FFD39B", "#F5F5DC"))+
scale_fill_manual(values=c("#838B8B", "#C1CDCD", "#F0E68C", "#FF8C00", "#1874CD", "#00BFFF", "#458B74", "#66CDAA", "#B4EEB4", "#8B7355", "#CDAA7D", "#FFD39B", "#F5F5DC"))+
#coord_flip()+
theme(axis.text.x=element_text(size=6))+
theme(axis.text.y=element_text(size=6))+
facet_wrap(~group)+
theme(legend.position="none")
#### COLLABORATIVE COUNTRIES
# unique_curated_dataset_and_tools<-curated_dataset_and_tools %>%
collaborative_curated_dataset_and_tools<-curated_dataset_and_tools %>%
filter(str_detect(PROSPERO_country, ',')) %>%
filter(., tool!="No") %>%
filter(., new_unitofanalysis!="No") %>%
filter(., measure!="Diagnostic Accuracy") %>%
filter(., measure!="BMJ Critical Appraisal Tools") %>%
filter(., measure!="CEBM Critical Appraisal Tools") %>%
filter(., measure!="JBI Critical Appraisal Tools") %>%
filter(., measure!="SIGN...SIGN.50 Critical Appraisal Tools")
collaborative_curated_dataset_and_tools<-collaborative_curated_dataset_and_tools %>%
mutate(new_unitofanalysis = fct_relevel(new_unitofanalysis, "Critical Appraisal of Clinical Practice Guidelines", "Critical Appraisal of Systematic Reviews", "Diagnostic Accuracy Studies","Economic Evaluation Studies","Health education and health behavior research studies", "RCTs", "Non-RCTs and Observational Studies", "RCTs and Observational Studies", "Quantitative Research (Public Health Research)", "Qualitative research studies", "Patient-Reported Outcome Measures Studies", "Mixed methods studies", "Medical education","BMJ Critical Appraisal Tools" ,"CEBM Critical Appraisal Tools","JBI Critical Appraisal Tools","SIGN...SIGN.50 Critical Appraisal Tools"))
ggplot(na.omit(collaborative_curated_dataset_and_tools[,c(1,3:6,13,14,21,24,25)]),aes(x=as.factor(ALL_year),fill=new_unitofanalysis, color=new_unitofanalysis, alpha=Freq_topics)) +
geom_bar(stat='count', aes(x=as.factor(ALL_year),fill=new_unitofanalysis, color=new_unitofanalysis, alpha=Freq_topics))+
scale_color_manual(values=c("#838B8B", "#C1CDCD", "#F0E68C", "#FF8C00", "#1874CD", "#00BFFF", "#458B74", "#66CDAA", "#B4EEB4", "#8B7355", "#CDAA7D", "#FFD39B", "#F5F5DC"))+
scale_fill_manual(values=c("#838B8B", "#C1CDCD", "#F0E68C", "#FF8C00", "#1874CD", "#00BFFF", "#458B74", "#66CDAA", "#B4EEB4", "#8B7355", "#CDAA7D", "#FFD39B", "#F5F5DC"))+
#coord_flip()+
theme(axis.text.x=element_text(size=6))+
theme(axis.text.y=element_text(size=6))+
scale_x_discrete(labels = c("2011", "2012", "2013", "2014", "2015", "2016", "2017"))+
facet_wrap(~measure)+
theme(legend.position="none")





### rank comare between continents
my_theme <- function() {
# Colors
color.background = "white"
color.text = "#22211d"
# Begin construction of chart
theme_bw(base_size=15) +
# Format background colors
theme(panel.background = element_rect(fill=color.background, color=color.background)) +
theme(plot.background = element_rect(fill=color.background, color=color.background)) +
theme(panel.border = element_rect(color=color.background)) +
theme(strip.background = element_rect(fill=color.background, color=color.background)) +
# Format the grid
theme(panel.grid.major.y = element_blank()) +
theme(panel.grid.minor.y = element_blank()) +
theme(axis.ticks = element_blank()) +
# Format the legend
theme(legend.position = "none") +
# Format title and axis labels
theme(plot.title = element_text(color=color.text, size=20, face = "bold")) +
theme(axis.title.x = element_text(size=14, color="black", face = "bold")) +
theme(axis.title.y = element_text(size=14, color="black", face = "bold", vjust=1.25)) +
theme(axis.text.x = element_text(size=10, vjust=0.5, hjust=0.5, color = color.text)) +
theme(axis.text.y = element_text(size=10, color = color.text)) +
theme(strip.text = element_text(face = "bold")) +
# Plot margins
theme(plot.margin = unit(c(0.35, 0.2, 0.3, 0.35), "cm"))
}
labels<-as.vector(levels(rank_data$disease))
rank_compare<-read.csv2(file="rank_compare.csv")
rank_data <- rank_compare %>% gather(continent,Rank,-disease)
ggplotColors <- function(g){
d <- 360/g
h <- cumsum(c(15, rep(d,g - 1)))
hcl(h = h, c = 100, l = 65)
}





Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.
When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).
The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.
LS0tCnRpdGxlOiAiQXBwcm9wcmlhdGVuZXNzIG9mIHRvb2wgdXNhZ2UgZm9yIGV2aWRlbmNlIGNyaXRpY2FsIGFwcHJhaXNhbDogQSBtZXRhLWVwaWRlbWlvbG9naWNhbCBzdHVkeSBvZiAyMCwwMDAgUFJPU1BFUk8gcmVjb3JkcyBvZiBub24tQ29jaHJhbmUgc3lzdGVtYXRpYyByZXZpZXdzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKICAKLS0tCgpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiAKClRyeSBleGVjdXRpbmcgdGhpcyBjaHVuayBieSBjbGlja2luZyB0aGUgKlJ1biogYnV0dG9uIHdpdGhpbiB0aGUgY2h1bmsgb3IgYnkgcGxhY2luZyB5b3VyIGN1cnNvciBpbnNpZGUgaXQgYW5kIHByZXNzaW5nICpDbWQrU2hpZnQrRW50ZXIqLiAKCmBgYHtyfQojIyMgcGFja2FnZXMgLS0tLS0tLS0tLQpsaWJyYXJ5KCJ0aWR5dmVyc2UiKQpsaWJyYXJ5KCJzdHJpbmdyIikKYGBgCgpgYGB7cn0KIyMjIyBkYXRhc2V0cyAtLS0tLS0tLS0tCiMjIyBkYXRhc2V0IGNvbiBsYXMgUm9CIHRvb2xzIHVzYWRhIGVuIGxvcyBwcm90b2NvbHMKZGF0YXNldF9yYXc8LXJlYWQuY3N2KGZpbGU9IlByb3NwZXJvX0ZpbmFsIEZpbGUuY3N2Iiwgc2VwPSI7IikKCiMjIyBkYXRhc2V0IGRlbCBhcnRpY3VsbyBwcmltZXJvIGRlIFBST1NQRVJPCmRhdGFzZXRfUFJPU1BFUk9fZmlyc3Q8LXJlYWQuY3N2MigicHJvdG9jb2xfZGF0YXNldF9jdXJhdGVkXzE3SlVOMjAxOC5jc3YiLCBzZXA9IjsiKQpkYXRhc2V0X1BST1NQRVJPX2ZpcnN0PC1kYXRhc2V0X1BST1NQRVJPX2ZpcnN0WyxjKDIsMyw3OjE0LDE2KV0KCiMjIyAgbWVyZ2UgZGF0YXNldF9yYXcgKyBkYXRhc2V0X2ZpcnN0IEJZIENSRHMKYWxsX2RhdGFzZXRfcHJvc3Blcm8yPC1tZXJnZShkYXRhc2V0X3JhdywgZGF0YXNldF9QUk9TUEVST19maXJzdCwgYnkueD0iY3JkcyIsIGJ5Lnk9IkNEUl9QUk9TUEVST19yZWNvcmRzIiwgYWxsLnk9VFJVRSwgYWxsLng9VFJVRSkKCiMjIyBmaW5hbCB2YXJpYWJsZSBzZWxlY3Rpb24gIApkYXRhc2V0X1BST1NQRVJPMl9maW5hbDwtYWxsX2RhdGFzZXRfcHJvc3Blcm8yWyxjKDEsNiw5OjYxLCA4NTo5MyldCmxhcHBseShkYXRhc2V0X1BST1NQRVJPMl9maW5hbFssYyg1OjU1KV0sIGxldmVscykKZmN0X2NvbGxhcHNlKGRhdGFzZXRfUFJPU1BFUk8yX2ZpbmFsJEJNSi5jaGVja2xpc3QsICdZZXMnID0gYygnWUVTJywgJ3llcycpKSAKZmN0X2NvbGxhcHNlKGRhdGFzZXRfUFJPU1BFUk8yX2ZpbmFsJENBU1AsICdZZXMnID0gYygnWUVTJywgJ3llcycpKSAKZmN0X2NvbGxhcHNlKGRhdGFzZXRfUFJPU1BFUk8yX2ZpbmFsJENIRUMubGlzdCwgJ1llcycgPSBjKCdZRVMnLCAneWVzJykpIApmY3RfY29sbGFwc2UoZGF0YXNldF9QUk9TUEVSTzJfZmluYWwkQ0hFRVJTLCAnWWVzJyA9IGMoJ1lFUycsICd5ZXMnKSkgCgoKCmZjdF9jb2xsYXBzZShkYXRhc2V0X1BST1NQRVJPMl9maW5hbCRDTVMuTUNNUywgJ1llcycgPSBjKCdZRVMgJywgJ3llcycpKSAKZmN0X2NvbGxhcHNlKGRhdGFzZXRfUFJPU1BFUk8yX2ZpbmFsJENPQ0hSQU5FLlJJU0suT0YuQklBUywgJ1llcycgPSBjKCdZRVMnLCAneWVzJykpIApmY3RfY29sbGFwc2UoZGF0YXNldF9QUk9TUEVSTzJfZmluYWwkQ09OU09SVCwgJ1llcycgPSBjKCdZRVMnLCAneWVzJykpIApmY3RfY29sbGFwc2UoZGF0YXNldF9QUk9TUEVSTzJfZmluYWwkQ09SRVEsICdZZXMnID0gYygnWUVTJywgJ3llcycpKSAKZmN0X2NvbGxhcHNlKGRhdGFzZXRfUFJPU1BFUk8yX2ZpbmFsJENPU01JTi5DSEVDTElTVCwgJ1llcycgPSBjKCdZRVMnLCAneWVzJykpIApmY3RfY29sbGFwc2UoZGF0YXNldF9QUk9TUEVSTzJfZmluYWwkRG93bnMuYW5kLkJsYWNrLCAnWWVzJyA9IGMoJ1lFUycsICd5ZXMnKSkgCmZjdF9jb2xsYXBzZShkYXRhc2V0X1BST1NQRVJPMl9maW5hbCREcnVtbW9uZC5jaGVja2xpc3QsICdZZXMnID0gYygnWUVTJywgJ3llcycpKSAKZmN0X2NvbGxhcHNlKGRhdGFzZXRfUFJPU1BFUk8yX2ZpbmFsJEVQSFBQLCAnWWVzJyA9IGMoJ1lFUycsICd5ZXMnKSkgCmZjdF9jb2xsYXBzZShkYXRhc2V0X1BST1NQRVJPMl9maW5hbCRHUkFERSwgJ1llcycgPSBjKCdZRVMnLCAneWVzJykpIApmY3RfY29sbGFwc2UoZGF0YXNldF9QUk9TUEVSTzJfZmluYWwkSVNQT1IsICdZZXMnID0gYygnWUVTJywgJ3llcycpKSAKZmN0X2NvbGxhcHNlKGRhdGFzZXRfUFJPU1BFUk8yX2ZpbmFsJEpBREFELCAnWWVzJyA9IGMoJ1lFUycsICd5ZXMnKSkgCmZjdF9jb2xsYXBzZShkYXRhc2V0X1BST1NQRVJPMl9maW5hbCRKQkksICdZZXMnID0gYygnWUVTJywgJ3llcycpKSAKZmN0X2NvbGxhcHNlKGRhdGFzZXRfUFJPU1BFUk8yX2ZpbmFsJE1DTUFTVEVSLCAnWWVzJyA9IGMoJ1lFUycsICd5ZXMnKSkgCmZjdF9jb2xsYXBzZShkYXRhc2V0X1BST1NQRVJPMl9maW5hbCRNRVJTUUksICdZZXMnID0gYygnWUVTICcsICd5ZXMnKSkgCmZjdF9jb2xsYXBzZShkYXRhc2V0X1BST1NQRVJPMl9maW5hbCRNSU5PUlMsICdZZXMnID0gYygnWUVTJywgJ3llcycpKSAKZmN0X2NvbGxhcHNlKGRhdGFzZXRfUFJPU1BFUk8yX2ZpbmFsJE5FV0NBU1RMRS5PVFRBV0EsICdZZXMnID0gYygnWUVTJywgJ3llcycpKSAKZmN0X2NvbGxhcHNlKGRhdGFzZXRfUFJPU1BFUk8yX2ZpbmFsJE9DRUJNLkNFQk0sICdZZXMnID0gYygnWUVTJywgJ3llcycpKSAKZmN0X2NvbGxhcHNlKGRhdGFzZXRfUFJPU1BFUk8yX2ZpbmFsJE9RQVEsICdZZXMnID0gYygnWUVTJywgJ3llcycpKSAKZmN0X2NvbGxhcHNlKGRhdGFzZXRfUFJPU1BFUk8yX2ZpbmFsJFBFRFJPLlNDQUxFLCAnWWVzJyA9IGMoJ1lFUycsICd5ZXMnKSkgCmZjdF9jb2xsYXBzZShkYXRhc2V0X1BST1NQRVJPMl9maW5hbCRQaGlsbGlwcy5jaGVja2xpc3QsICdZZXMnID0gYygnWUVTJywgJ3llcycpKSAKZmN0X2NvbGxhcHNlKGRhdGFzZXRfUFJPU1BFUk8yX2ZpbmFsJFBSSVNNQSwgJ1llcycgPSBjKCdZRVMnLCAneWVzJykpIApmY3RfY29sbGFwc2UoZGF0YXNldF9QUk9TUEVSTzJfZmluYWwkUVVBREFTLlFVQURBUy4yLCAnWWVzJyA9IGMoJ1lFUycsICd5ZXMnKSkgCmZjdF9jb2xsYXBzZShkYXRhc2V0X1BST1NQRVJPMl9maW5hbCRSRS5BSU0sICdZZXMnID0gYygnWUVTJywgJ3llcycpKSAKZmN0X2NvbGxhcHNlKGRhdGFzZXRfUFJPU1BFUk8yX2ZpbmFsJFJFQklQLCAnWWVzJyA9IGMoJ1lFUycsICd5ZXMnKSkgCmZjdF9jb2xsYXBzZShkYXRhc2V0X1BST1NQRVJPMl9maW5hbCRSb0JBTlMsICdZZXMnID0gYygnWUVTJywgJ3llcycpKSAKZmN0X2NvbGxhcHNlKGRhdGFzZXRfUFJPU1BFUk8yX2ZpbmFsJFNJR04uLi5TSUdOLjUwLCAnWWVzJyA9IGMoJ1lFUycsICd5ZXMnKSkgCmZjdF9jb2xsYXBzZShkYXRhc2V0X1BST1NQRVJPMl9maW5hbCRTVEFSRCwgJ1llcycgPSBjKCdZRVMnLCAneWVzJykpIApmY3RfY29sbGFwc2UoZGF0YXNldF9QUk9TUEVSTzJfZmluYWwkU1RST0JFLCAnWWVzJyA9IGMoJ1lFUycsICd5ZXMnKSkgCgphdHRhY2goZGF0YXNldF9QUk9TUEVSTzJfZmluYWwpCgpkYXRhc2V0X1BST1NQRVJPMl9maW5hbCA8LSBkYXRhc2V0X1BST1NQRVJPMl9maW5hbCAlPiUKICBtdXRhdGUoQU1TVEFSID0gZmN0X3JlY29kZShBTVNUQVIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZZXMiID0gIllFUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlllcyIgPSAiWWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWWVzIiA9ICJ5ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyIgPSAiIikpCnZhcjwtbmFtZXMoZGF0YXNldF9QUk9TUEVSTzJfZmluYWxbLGMoNTo1NSldKQp2YXJpYWJsZXM8LXVubGlzdCh2YXIpCmRhdGFzZXRfUFJPU1BFUk8yX2ZpbmFsICU+JSBtdXRhdGVfYXQoLnZhcnMgPSAjdmFycyhkYXRhc2V0X1BST1NQRVJPMl9maW5hbFssYyg1OjU1KV0pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih2YXJpYWJsZXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mdW5zPWZvcmNhdHM6OmZjdF9yZWNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlllcyIgPSAiWUVTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWWVzIiA9ICJZZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZZXMiID0gInllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIiA9ICIiKQoKbGV2ZWxzKGRhdGFzZXRfUFJPU1BFUk8yX2ZpbmFsJEJNSi5jaGVja2xpc3QpCgoKIyMjIyMjIyAgc2ltcGxpZmljYXJuaXZlbGVzIGRlIHRvcGljIGEgdW5hIG3DoXMgZ2VuZXJhbApkYXRhc2V0X1BST1NQRVJPMl9maW5hbDwtZGF0YXNldF9QUk9TUEVSTzJfZmluYWwgJT4lIAogIG11dGF0ZShUb3BpY19ncmFsPXJlY29kZShUb3BpYywgYygiY2FuY2VyIiA9ICJDYW5jZXIiKSkpCmBgYAoKCmBgYHtyfQojIyMjICBleHRyYWVyIENSRHMgZGVsIGNhbXBvIENpdGF0aW9uIGNvbiByZWdleAoKcHJvc3Blcm9JRDwtIltDXVtSXVtEXShbMC05XVswLTldWzAtOV1bMC05XVswLTldWzAtOV1bMC05XVswLTldWzAtOV1bMC05XVswLTldKSIKZGF0YXNldF9yYXckY3Jkczwtc3RyX2V4dHJhY3QoZGF0YXNldF9yYXckQ2l0YXRpb24sIHByb3NwZXJvSUQpCgpgYGAKCgpgYGB7cn0KY3VyYXRlZF9kYXRhc2V0PC1yZWFkLmNzdjIoZmlsZT0iZGF0YXNldF9QUk9TUEVSTzJfZmluYWwuY3N2IikKY3VyYXRlZF9kYXRhc2V0X21pbjwtY3VyYXRlZF9kYXRhc2V0WyxjKDIsNCw1OjEwLDE2MToxNzEpXQp0b29sczwtcmVhZC5jc3YyKGZpbGU9ImNyZF9hcHByYWlzYWxfdG9vbHMuY3N2IikKY3VyYXRlZF9kYXRhc2V0X2FuZF90b29sczwtbWVyZ2UodG9vbHMsIGN1cmF0ZWRfZGF0YXNldF9taW4sIGJ5Lng9ImNyZHMiLCBieS55PSJjcmRzIiwgYWxsLng9VFJVRSkKYGBgCgpgYGB7cn0KdW5pcXVlX2N1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHM8LWN1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHMgJT4lIAogIGZpbHRlciguLCB1bmlxdWVfY291bnRyeT09InVuaXF1ZSIpICU+JQogIGZpbHRlciguLCB0b29sIT0iTm8iKQpnZ3Bsb3QobmEub21pdCh1bmlxdWVfY3VyYXRlZF9kYXRhc2V0X2FuZF90b29sc1ssYygzOjYsMTMsMTQsMjEpXSksYWVzKHg9VG9waWNzX2dlbmVyYWwseT10b29sLCBjb2xvcj1tZWFzdXJlKSkgKyAKICBnZW9tX2NvdW50KGFlcyh4PVRvcGljc19nZW5lcmFsLHk9dG9vbCwgY29sb3I9bWVhc3VyZSkpKwogIGNvb3JkX2ZsaXAoKSsKICB0aGVtZShheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT00KSkrCiAgI2ZhY2V0X3dyYXAofnVuaXF1ZV9jb250aW5lbnQpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCmBgYAoKYGBge3J9Cgp0YWJsZV90b3BpY3MgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShjdXJhdGVkX2RhdGFzZXRfYW5kX3Rvb2xzJFRvcGljc19nZW5lcmFsKSkKdGFibGVfdG9waWNzJEZyZXEgPC0gYyhzY2FsZSh0YWJsZV90b3BpY3MkRnJlcSkpCmN1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHM8LW1lcmdlKGN1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHMsIHRhYmxlX3RvcGljcywgYnkueD0iVG9waWNzX2dlbmVyYWwiLCBieS55ID0gIlZhcjEiLCBhbGwueCA9IFRSVUUpCmNvbG5hbWVzKGN1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHMpW3doaWNoKGNvbG5hbWVzKGN1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHMpID09ICdGcmVxJyldIDwtICdGcmVxX3RvcGljcycKCgoKY3VyYXRlZF9kYXRhc2V0X2FuZF90b29scyA8LSBjdXJhdGVkX2RhdGFzZXRfYW5kX3Rvb2xzICU+JSAKICBtdXRhdGUobmV3X3VuaXRvZmFuYWx5c2lzID0gZm9yY2F0czo6ZmN0X3JlY29kZSh1bml0b2ZhbmFseXNpcywgCiAgICAgICAgICAgICdSQ1RzJyA9ICJSQ1RzIiwgJ05vbi1SQ1RzIGFuZCBPYnNlcnZhdGlvbmFsIFN0dWRpZXMnID0gIk5vbi1SQ1RzIGFuZCBPYnNlcnZhdGlvbmFsIHN0dWRpZXMiLCAnTm9uLVJDVHMgYW5kIE9ic2VydmF0aW9uYWwgU3R1ZGllcycgPSAiTm9uLVJDVHMgb3IgT2JzZXJ2YXRpb25hbCBTdHVkaWVzIiwKICAgICAgICAgICAgJ1JDVHMgYW5kIE9ic2VydmF0aW9uYWwgU3R1ZGllcycgPSAiUkNUcyBhbmQgb2JzZXJ2YXRpb25hbCBzdHVkaWVzIiwKICAgICAgICAgICAgJ1JDVHMgYW5kIE9ic2VydmF0aW9uYWwgU3R1ZGllcycgPSAiUkNUcyBhbmQgT2JzZXJ2YXRpb25hbCBzdHVkaWVzIiwgCiAgICAgICAgICAgICMnUHVibGljIEhlYWx0aCBSZXNlYXJjaCcgPSAiUXVhbnRpdGF0aXZlIFJlc2VhcmNoIChQdWJsaWMgSGVhbHRoIFJlc2VhcmNoKSIsIAogICAgICAgICAgICAnUXVhbGl0YXRpdmUgcmVzZWFyY2ggc3R1ZGllcycgPSAiUXVhbGl0YXRpdmUgcmVzZWFyY2giLAogICAgICAgICAgICAnUXVhbGl0YXRpdmUgcmVzZWFyY2ggc3R1ZGllcycgPSAiUXVhbGl0YXRpdmUgcmVzZWFyY2ggc3R1ZGllcyIsCiAgICAgICAgICAgICdNaXhlZCBtZXRob2RzIHN0dWRpZXMnID0gIk1peGVkIG1ldGhvZHMgc3R1ZGllcyIsIAogICAgICAgICAgICAnUGF0aWVudC1SZXBvcnRlZCBPdXRjb21lIE1lYXN1cmVzIFN0dWRpZXMnID0gIlBhdGllbnQtUmVwb3J0ZWQgT3V0Y29tZSBNZWFzdXJlcyIsCiAgICAgICAgICAgIAogICAgICAgICAgICAnU0lHTi4uLlNJR04uNTAgQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzJyA9ICJTSUdOLi4uU0lHTi41MCBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiLAogICAgICAgICAgICAnQk1KIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scycgPSAiQk1KIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIsICAgCiAgICAgICAgICAgICdDRUJNIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scycgPSAiQ0VCTSBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiLCAgCiAgICAgICAgICAgICdKQkkgQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzJyA9ICJKQkkgQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIiwgCiAgICAgICAgICAgJ0NyaXRpY2FsIEFwcHJhaXNhbCBvZiBDbGluaWNhbCBQcmFjdGljZSBHdWlkZWxpbmVzJyA9ICJDcml0aWNhbCBBcHByYWlzYWwgb2YgQ2xpbmljYWwgUHJhY3RpY2UgR3VpZGVsaW5lcyIsCiAgICAgICAgICAgJ0NyaXRpY2FsIEFwcHJhaXNhbCBvZiBTeXN0ZW1hdGljIFJldmlld3MnID0gIkNyaXRpY2FsIEFwcHJhaXNhbCBvZiBTeXN0ZW1hdGljIFJldmlld3MiLCAKICAgICAgICAgICAnRGlhZ25vc3RpYyBBY2N1cmFjeSBTdHVkaWVzJyA9ICJEaWFnbm9zdGljIEFjY3VyYWN5IFN0dWRpZXMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgJ0Vjb25vbWljIEV2YWx1YXRpb24gU3R1ZGllcycgPSAiRWNvbm9taWMgZXZhbHVhdGlvbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICMnSGVhbHRoIGVkdWNhdGlvbiBhbmQgaGVhbHRoIGJlaGF2aW9yIHJlc2VhcmNoIHN0dWRpZXMnID0gIkhlYWx0aCBlZHVjYXRpb24gYW5kIGhlYWx0aCBiZWhhdmlvciByZXNlYXJjaCBzdHVkaWVzIiwKICAgICAgICAgICAnTWVkaWNhbCBlZHVjYXRpb24nID0gIk1lZGljYWwgZWR1Y2F0aW9uIiwgICAKICAgICAgICAgICAnTm8nID0gIlF1YWxpdHkiLAogICAgICAgICAgICdObycgPSAiTm8iKSkKCiMjIyMgVW5pcXVlIENvdW50cmllcwp1bmlxdWVfY3VyYXRlZF9kYXRhc2V0X2FuZF90b29sczwtY3VyYXRlZF9kYXRhc2V0X2FuZF90b29scyAlPiUgCiAgZmlsdGVyKC4sIHVuaXF1ZV9jb3VudHJ5PT0idW5pcXVlIikgJT4lCiAgZmlsdGVyKC4sIHRvb2whPSJObyIpICU+JQogIGZpbHRlciguLCBuZXdfdW5pdG9mYW5hbHlzaXMhPSJObyIpICU+JQogIGZpbHRlciguLCBtZWFzdXJlIT0iQk1KIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIpICU+JQogIGZpbHRlciguLCBtZWFzdXJlIT0iQ0VCTSBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiKSAlPiUKICBmaWx0ZXIoLiwgbWVhc3VyZSE9IkpCSSBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiKSAlPiUKICBmaWx0ZXIoLiwgbWVhc3VyZSE9IlNJR04uLi5TSUdOLjUwIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIpCgp1bmlxdWVfY3VyYXRlZF9kYXRhc2V0X2FuZF90b29sczwtdW5pcXVlX2N1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHMgJT4lCiAgbXV0YXRlKG5ld191bml0b2ZhbmFseXNpcyA9IGZjdF9yZWxldmVsKG5ld191bml0b2ZhbmFseXNpcywgIkNyaXRpY2FsIEFwcHJhaXNhbCBvZiBDbGluaWNhbCBQcmFjdGljZSBHdWlkZWxpbmVzIiwgIkNyaXRpY2FsIEFwcHJhaXNhbCBvZiBTeXN0ZW1hdGljIFJldmlld3MiLCAiRGlhZ25vc3RpYyBBY2N1cmFjeSBTdHVkaWVzIiwiRWNvbm9taWMgRXZhbHVhdGlvbiBTdHVkaWVzIiwiSGVhbHRoIGVkdWNhdGlvbiBhbmQgaGVhbHRoIGJlaGF2aW9yIHJlc2VhcmNoIHN0dWRpZXMiLCAiUkNUcyIsICJOb24tUkNUcyBhbmQgT2JzZXJ2YXRpb25hbCBTdHVkaWVzIiwgIlJDVHMgYW5kIE9ic2VydmF0aW9uYWwgU3R1ZGllcyIsICJRdWFudGl0YXRpdmUgUmVzZWFyY2ggKFB1YmxpYyBIZWFsdGggUmVzZWFyY2gpIiwgIlF1YWxpdGF0aXZlIHJlc2VhcmNoIHN0dWRpZXMiLCAiUGF0aWVudC1SZXBvcnRlZCBPdXRjb21lIE1lYXN1cmVzIFN0dWRpZXMiLCAiTWl4ZWQgbWV0aG9kcyBzdHVkaWVzIiwgIk1lZGljYWwgZWR1Y2F0aW9uIiwiQk1KIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIgLCJDRUJNIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIsIkpCSSBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiLCJTSUdOLi4uU0lHTi41MCBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiKSkKZ2dwbG90KG5hLm9taXQodW5pcXVlX2N1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHNbLGMoMSwzOjYsMTMsMTQsMjEsMjQsMjUpXSksYWVzKHg9VG9waWNzX2dlbmVyYWwseT10b29sLCBmaWxsPW5ld191bml0b2ZhbmFseXNpcywgY29sb3I9bmV3X3VuaXRvZmFuYWx5c2lzLCBzaGFwZT1tZWFzdXJlLCBhbHBoYT1GcmVxX3RvcGljcykpICsgCiAgZ2VvbV9jb3VudChhZXMoeD1Ub3BpY3NfZ2VuZXJhbCx5PXRvb2wsIGZpbGw9bmV3X3VuaXRvZmFuYWx5c2lzLCAgY29sb3I9bmV3X3VuaXRvZmFuYWx5c2lzLCAgIHNoYXBlPW1lYXN1cmUsYWxwaGE9RnJlcV90b3BpY3MpKSsKICBzY2FsZV9zaGFwZShuYW1lID0gIkFzc2Vzc21lbnQgb2JqZWN0aXZlIikrCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDI0LDIxLDIyLDI1KSkrCiAgY29vcmRfZmxpcCgpKwogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChhbmdsZT0wLCBzaXplPTYpKSsKICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTAsIHNpemU9NiwgaGp1c3Q9MSkpKwogIGZhY2V0X3dyYXAofm1lYXN1cmUpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgoKZ2dwbG90KG5hLm9taXQodW5pcXVlX2N1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHNbLGMoMSwzOjYsMTMsMTQsMjEsMjQsMjUpXSksYWVzKHg9dG9vbCwgZmlsbD11bmlxdWVfY29udGluZW50LCBjb2xvcj11bmlxdWVfY29udGluZW50KSkgKyAKICBnZW9tX2JhcihhZXMoeD10b29sLCBmaWxsPXVuaXF1ZV9jb250aW5lbnQsICBjb2xvcj11bmlxdWVfY29udGluZW50KSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjNjQ5NUVEIiwgIiNGRjMwMzAiLCAiI0NEQUE3RCIsICIjRkZENzAwIiwgIiM0NThCMDAiKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM2NDk1RUQiLCAiI0ZGMzAzMCIsICIjQ0RBQTdEIiwgIiNGRkQ3MDAiLCAiIzQ1OEIwMCIpKSsKICBjb29yZF9mbGlwKCkrCiAgdGhlbWUoYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KGFuZ2xlPTAsIHNpemU9NikpKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCwgc2l6ZT02LCBoanVzdD0xKSkrCiAgZmFjZXRfd3JhcCh+QUxMX3llYXIpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCmBgYAoKYGBge3J9CiMjIyMgQ29sbGFib3JhdGl2ZSBDb3VudHJpZXMKIyMjIyBubyBwYXJlY2UgbXV5IGRpZmVyZW50ZSBhbCBwbG90IGNvbiB1bmlxdWUhISEhICA6LSgKY29sbGFib3JhdGl2ZV9jdXJhdGVkX2RhdGFzZXRfYW5kX3Rvb2xzPC1jdXJhdGVkX2RhdGFzZXRfYW5kX3Rvb2xzICU+JSAKICAjZmlsdGVyKC4sIHVuaXF1ZV9jb3VudHJ5PT0idW5pcXVlIikgJT4lCiAgZmlsdGVyKC4sIHRvb2whPSJObyIpICU+JQogIGZpbHRlciguLCBuZXdfdW5pdG9mYW5hbHlzaXMhPSJObyIpICU+JQogIGZpbHRlciguLCBtZWFzdXJlIT0iQk1KIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIpICU+JQogIGZpbHRlciguLCBtZWFzdXJlIT0iQ0VCTSBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiKSAlPiUKICBmaWx0ZXIoLiwgbWVhc3VyZSE9IkpCSSBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiKSAlPiUKICBmaWx0ZXIoLiwgbWVhc3VyZSE9IlNJR04uLi5TSUdOLjUwIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIpCgpjb2xsYWJvcmF0aXZlX2N1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHM8LWNvbGxhYm9yYXRpdmVfY3VyYXRlZF9kYXRhc2V0X2FuZF90b29scyAlPiUKICBtdXRhdGUobmV3X3VuaXRvZmFuYWx5c2lzID0gZmN0X3JlbGV2ZWwobmV3X3VuaXRvZmFuYWx5c2lzLCAiQ3JpdGljYWwgQXBwcmFpc2FsIG9mIENsaW5pY2FsIFByYWN0aWNlIEd1aWRlbGluZXMiLCAiQ3JpdGljYWwgQXBwcmFpc2FsIG9mIFN5c3RlbWF0aWMgUmV2aWV3cyIsICJEaWFnbm9zdGljIEFjY3VyYWN5IFN0dWRpZXMiLCJFY29ub21pYyBFdmFsdWF0aW9uIFN0dWRpZXMiLCJIZWFsdGggZWR1Y2F0aW9uIGFuZCBoZWFsdGggYmVoYXZpb3IgcmVzZWFyY2ggc3R1ZGllcyIsICJSQ1RzIiwgIk5vbi1SQ1RzIGFuZCBPYnNlcnZhdGlvbmFsIFN0dWRpZXMiLCAiUkNUcyBhbmQgT2JzZXJ2YXRpb25hbCBTdHVkaWVzIiwgIlF1YW50aXRhdGl2ZSBSZXNlYXJjaCAoUHVibGljIEhlYWx0aCBSZXNlYXJjaCkiLCAiUXVhbGl0YXRpdmUgcmVzZWFyY2ggc3R1ZGllcyIsICJQYXRpZW50LVJlcG9ydGVkIE91dGNvbWUgTWVhc3VyZXMgU3R1ZGllcyIsICJNaXhlZCBtZXRob2RzIHN0dWRpZXMiLCAiTWVkaWNhbCBlZHVjYXRpb24iLCJCTUogQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIiAsIkNFQk0gQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIiwiSkJJIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIsIlNJR04uLi5TSUdOLjUwIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIpKQpnZ3Bsb3QobmEub21pdChjb2xsYWJvcmF0aXZlX2N1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHNbLGMoMSwzOjYsMTMsMTQsMjEsMjQsMjUpXSksYWVzKHg9VG9waWNzX2dlbmVyYWwseT10b29sLCBmaWxsPW5ld191bml0b2ZhbmFseXNpcywgY29sb3I9bmV3X3VuaXRvZmFuYWx5c2lzLCBzaGFwZT1tZWFzdXJlLCBhbHBoYT1GcmVxX3RvcGljcykpICsgCiAgZ2VvbV9jb3VudChhZXMoeD1Ub3BpY3NfZ2VuZXJhbCx5PXRvb2wsIGZpbGw9bmV3X3VuaXRvZmFuYWx5c2lzLCAgY29sb3I9bmV3X3VuaXRvZmFuYWx5c2lzLCAgIHNoYXBlPW1lYXN1cmUsYWxwaGE9RnJlcV90b3BpY3MpKSsKICBzY2FsZV9zaGFwZShuYW1lID0gIkFzc2Vzc21lbnQgb2JqZWN0aXZlIikrCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcz1jKDI0LDIxLDIyLDI1KSkrCiAgY29vcmRfZmxpcCgpKwogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChhbmdsZT0wLCBzaXplPTYpKSsKICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTAsIHNpemU9NiwgaGp1c3Q9MSkpKwogIGZhY2V0X3dyYXAofm1lYXN1cmUpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCmBgYAoKYGBge3IgVE9QSUNTIEJZIG1lYXN1cmUgQU5EIHVuaXQgb2YgYW5hbHlzaXN9CiMjIyMgYmFycGxvdHMgCiMjIyMgdG9waWMgWCBtZWFzdXJlIEFORCB1bml0T2ZBbmFsaXN5cwojIyMjIFVOSVFVRSBDT1VOVFJJRVMKdW5pcXVlX2N1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHM8LWN1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHMgJT4lIAogIGZpbHRlciguLCB1bmlxdWVfY291bnRyeT09InVuaXF1ZSIpICU+JQogIGZpbHRlciguLCB0b29sIT0iTm8iKSAlPiUKICBmaWx0ZXIoLiwgbmV3X3VuaXRvZmFuYWx5c2lzIT0iTm8iKSAlPiUKICBmaWx0ZXIoLiwgbWVhc3VyZSE9IkRpYWdub3N0aWMgQWNjdXJhY3kiKSAlPiUKICBmaWx0ZXIoLiwgbWVhc3VyZSE9IkJNSiBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiKSAlPiUKICBmaWx0ZXIoLiwgbWVhc3VyZSE9IkNFQk0gQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIikgJT4lCiAgZmlsdGVyKC4sIG1lYXN1cmUhPSJKQkkgQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIikgJT4lCiAgZmlsdGVyKC4sIG1lYXN1cmUhPSJTSUdOLi4uU0lHTi41MCBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiKQoKdW5pcXVlX2N1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHM8LXVuaXF1ZV9jdXJhdGVkX2RhdGFzZXRfYW5kX3Rvb2xzICU+JQogIG11dGF0ZShuZXdfdW5pdG9mYW5hbHlzaXMgPSBmY3RfcmVsZXZlbChuZXdfdW5pdG9mYW5hbHlzaXMsICJDcml0aWNhbCBBcHByYWlzYWwgb2YgQ2xpbmljYWwgUHJhY3RpY2UgR3VpZGVsaW5lcyIsICJDcml0aWNhbCBBcHByYWlzYWwgb2YgU3lzdGVtYXRpYyBSZXZpZXdzIiwgIkRpYWdub3N0aWMgQWNjdXJhY3kgU3R1ZGllcyIsIkVjb25vbWljIEV2YWx1YXRpb24gU3R1ZGllcyIsIkhlYWx0aCBlZHVjYXRpb24gYW5kIGhlYWx0aCBiZWhhdmlvciByZXNlYXJjaCBzdHVkaWVzIiwgIlJDVHMiLCAiTm9uLVJDVHMgYW5kIE9ic2VydmF0aW9uYWwgU3R1ZGllcyIsICJSQ1RzIGFuZCBPYnNlcnZhdGlvbmFsIFN0dWRpZXMiLCAiUXVhbnRpdGF0aXZlIFJlc2VhcmNoIChQdWJsaWMgSGVhbHRoIFJlc2VhcmNoKSIsICJRdWFsaXRhdGl2ZSByZXNlYXJjaCBzdHVkaWVzIiwgIlBhdGllbnQtUmVwb3J0ZWQgT3V0Y29tZSBNZWFzdXJlcyBTdHVkaWVzIiwgIk1peGVkIG1ldGhvZHMgc3R1ZGllcyIsICJNZWRpY2FsIGVkdWNhdGlvbiIsIkJNSiBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiICwiQ0VCTSBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiLCJKQkkgQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIiwiU0lHTi4uLlNJR04uNTAgQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIikpCgpnZ3Bsb3QobmEub21pdCh1bmlxdWVfY3VyYXRlZF9kYXRhc2V0X2FuZF90b29sc1ssYygxLDM6NiwxMywxNCwyMSwyNCwyNSldKSxhZXMoeD1Ub3BpY3NfZ2VuZXJhbCxmaWxsPW5ld191bml0b2ZhbmFseXNpcywgY29sb3I9bmV3X3VuaXRvZmFuYWx5c2lzLCBhbHBoYT1GcmVxX3RvcGljcykpICsgCiAgZ2VvbV9iYXIoc3RhdD0nY291bnQnLCBhZXMoeD1Ub3BpY3NfZ2VuZXJhbCxmaWxsPW5ld191bml0b2ZhbmFseXNpcywgY29sb3I9bmV3X3VuaXRvZmFuYWx5c2lzLCBhbHBoYT1GcmVxX3RvcGljcykpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiIzgzOEI4QiIsICIjQzFDRENEIiwgIiNGMEU2OEMiLCAiI0ZGOEMwMCIsICIjMTg3NENEIiwgIiMwMEJGRkYiLCAiIzQ1OEI3NCIsICIjNjZDREFBIiwgIiNCNEVFQjQiLCAiIzhCNzM1NSIsICIjQ0RBQTdEIiwgIiNGRkQzOUIiLCAiI0Y1RjVEQyIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzgzOEI4QiIsICIjQzFDRENEIiwgIiNGMEU2OEMiLCAiI0ZGOEMwMCIsICIjMTg3NENEIiwgIiMwMEJGRkYiLCAiIzQ1OEI3NCIsICIjNjZDREFBIiwgIiNCNEVFQjQiLCAiIzhCNzM1NSIsICIjQ0RBQTdEIiwgIiNGRkQzOUIiLCAiI0Y1RjVEQyIpKSsKICBjb29yZF9mbGlwKCkrCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9NikpKwogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTEwKSkrCiAgZmFjZXRfd3JhcCh+bWVhc3VyZSkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCgojIyMjIENPTExBQk9SQVRJVkUgQ09VTlRSSUVTCiMgdW5pcXVlX2N1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHM8LWN1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHMgJT4lIApjb2xsYWJvcmF0aXZlX2N1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHM8LWN1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHMgJT4lIAogIGZpbHRlcihzdHJfZGV0ZWN0KFBST1NQRVJPX2NvdW50cnksICcsJykpICU+JQogIGZpbHRlciguLCB0b29sIT0iTm8iKSAlPiUKICBmaWx0ZXIoLiwgbmV3X3VuaXRvZmFuYWx5c2lzIT0iTm8iKSAlPiUKICBmaWx0ZXIoLiwgbWVhc3VyZSE9IkRpYWdub3N0aWMgQWNjdXJhY3kiKSAlPiUKICBmaWx0ZXIoLiwgbWVhc3VyZSE9IkJNSiBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiKSAlPiUKICBmaWx0ZXIoLiwgbWVhc3VyZSE9IkNFQk0gQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIikgJT4lCiAgZmlsdGVyKC4sIG1lYXN1cmUhPSJKQkkgQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIikgJT4lCiAgZmlsdGVyKC4sIG1lYXN1cmUhPSJTSUdOLi4uU0lHTi41MCBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiKQoKY29sbGFib3JhdGl2ZV9jdXJhdGVkX2RhdGFzZXRfYW5kX3Rvb2xzPC1jb2xsYWJvcmF0aXZlX2N1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHMgJT4lCiAgbXV0YXRlKG5ld191bml0b2ZhbmFseXNpcyA9IGZjdF9yZWxldmVsKG5ld191bml0b2ZhbmFseXNpcywgIkNyaXRpY2FsIEFwcHJhaXNhbCBvZiBDbGluaWNhbCBQcmFjdGljZSBHdWlkZWxpbmVzIiwgIkNyaXRpY2FsIEFwcHJhaXNhbCBvZiBTeXN0ZW1hdGljIFJldmlld3MiLCAiRGlhZ25vc3RpYyBBY2N1cmFjeSBTdHVkaWVzIiwiRWNvbm9taWMgRXZhbHVhdGlvbiBTdHVkaWVzIiwiSGVhbHRoIGVkdWNhdGlvbiBhbmQgaGVhbHRoIGJlaGF2aW9yIHJlc2VhcmNoIHN0dWRpZXMiLCAiUkNUcyIsICJOb24tUkNUcyBhbmQgT2JzZXJ2YXRpb25hbCBTdHVkaWVzIiwgIlJDVHMgYW5kIE9ic2VydmF0aW9uYWwgU3R1ZGllcyIsICJRdWFudGl0YXRpdmUgUmVzZWFyY2ggKFB1YmxpYyBIZWFsdGggUmVzZWFyY2gpIiwgIlF1YWxpdGF0aXZlIHJlc2VhcmNoIHN0dWRpZXMiLCAiUGF0aWVudC1SZXBvcnRlZCBPdXRjb21lIE1lYXN1cmVzIFN0dWRpZXMiLCAiTWl4ZWQgbWV0aG9kcyBzdHVkaWVzIiwgIk1lZGljYWwgZWR1Y2F0aW9uIiwiQk1KIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIgLCJDRUJNIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIsIkpCSSBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiLCJTSUdOLi4uU0lHTi41MCBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiKSkKCmdncGxvdChuYS5vbWl0KGNvbGxhYm9yYXRpdmVfY3VyYXRlZF9kYXRhc2V0X2FuZF90b29sc1ssYygxLDM6NiwxMywxNCwyMSwyNCwyNSldKSxhZXMoeD1Ub3BpY3NfZ2VuZXJhbCxmaWxsPW5ld191bml0b2ZhbmFseXNpcywgY29sb3I9bmV3X3VuaXRvZmFuYWx5c2lzLCBhbHBoYT1GcmVxX3RvcGljcykpICsgCiAgZ2VvbV9iYXIoc3RhdD0nY291bnQnLCBhZXMoeD1Ub3BpY3NfZ2VuZXJhbCxmaWxsPW5ld191bml0b2ZhbmFseXNpcywgY29sb3I9bmV3X3VuaXRvZmFuYWx5c2lzLCBhbHBoYT1GcmVxX3RvcGljcywgZHJvcCA9IEZBTFNFKSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjODM4QjhCIiwgIiNDMUNEQ0QiLCAiI0YwRTY4QyIsICIjRkY4QzAwIiwgIiMxODc0Q0QiLCAiIzAwQkZGRiIsICIjNDU4Qjc0IiwgIiM2NkNEQUEiLCAiI0I0RUVCNCIsICIjOEI3MzU1IiwgIiNDREFBN0QiLCAiI0ZGRDM5QiIsICIjRjVGNURDIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjODM4QjhCIiwgIiNDMUNEQ0QiLCAiI0YwRTY4QyIsICIjRkY4QzAwIiwgIiMxODc0Q0QiLCAiIzAwQkZGRiIsICIjNDU4Qjc0IiwgIiM2NkNEQUEiLCAiI0I0RUVCNCIsICIjOEI3MzU1IiwgIiNDREFBN0QiLCAiI0ZGRDM5QiIsICIjRjVGNURDIikpKwogIGNvb3JkX2ZsaXAoKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCA1MDApKSsKICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT02KSkrCiAgdGhlbWUoYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MTApKSsKICBmYWNldF93cmFwKH5tZWFzdXJlKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQoKYGBgCgoKYGBge3J9CiMjIyMgIAojIyMjIG5ld3VuaXRPRmFuYWx5c2lzIFggbWVhc3VyZSBBTkQgeWVhcgojIyMjIFVOSVFVRSBDT1VOVFJJRVMKdW5pcXVlX2N1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHM8LWN1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHMgJT4lIAogIGZpbHRlciguLCB1bmlxdWVfY291bnRyeT09InVuaXF1ZSIpICU+JQogIGZpbHRlciguLCB0b29sIT0iTm8iKSAlPiUKICBmaWx0ZXIoLiwgbmV3X3VuaXRvZmFuYWx5c2lzIT0iTm8iKSAlPiUKICBmaWx0ZXIoLiwgbWVhc3VyZSE9IkRpYWdub3N0aWMgQWNjdXJhY3kiKSAlPiUKICBmaWx0ZXIoLiwgbWVhc3VyZSE9IkJNSiBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiKSAlPiUKICBmaWx0ZXIoLiwgbWVhc3VyZSE9IkNFQk0gQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIikgJT4lCiAgZmlsdGVyKC4sIG1lYXN1cmUhPSJKQkkgQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIikgJT4lCiAgZmlsdGVyKC4sIG1lYXN1cmUhPSJTSUdOLi4uU0lHTi41MCBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiKQoKdW5pcXVlX2N1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHM8LXVuaXF1ZV9jdXJhdGVkX2RhdGFzZXRfYW5kX3Rvb2xzICU+JQogIG11dGF0ZShuZXdfdW5pdG9mYW5hbHlzaXMgPSBmY3RfcmVsZXZlbChuZXdfdW5pdG9mYW5hbHlzaXMsICJDcml0aWNhbCBBcHByYWlzYWwgb2YgQ2xpbmljYWwgUHJhY3RpY2UgR3VpZGVsaW5lcyIsICJDcml0aWNhbCBBcHByYWlzYWwgb2YgU3lzdGVtYXRpYyBSZXZpZXdzIiwgIkRpYWdub3N0aWMgQWNjdXJhY3kgU3R1ZGllcyIsIkVjb25vbWljIEV2YWx1YXRpb24gU3R1ZGllcyIsIkhlYWx0aCBlZHVjYXRpb24gYW5kIGhlYWx0aCBiZWhhdmlvciByZXNlYXJjaCBzdHVkaWVzIiwgIlJDVHMiLCAiTm9uLVJDVHMgYW5kIE9ic2VydmF0aW9uYWwgU3R1ZGllcyIsICJSQ1RzIGFuZCBPYnNlcnZhdGlvbmFsIFN0dWRpZXMiLCAiUXVhbnRpdGF0aXZlIFJlc2VhcmNoIChQdWJsaWMgSGVhbHRoIFJlc2VhcmNoKSIsICJRdWFsaXRhdGl2ZSByZXNlYXJjaCBzdHVkaWVzIiwgIlBhdGllbnQtUmVwb3J0ZWQgT3V0Y29tZSBNZWFzdXJlcyBTdHVkaWVzIiwgIk1peGVkIG1ldGhvZHMgc3R1ZGllcyIsICJNZWRpY2FsIGVkdWNhdGlvbiIsIkJNSiBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiICwiQ0VCTSBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiLCJKQkkgQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIiwiU0lHTi4uLlNJR04uNTAgQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIikpCgpnZ3Bsb3QobmEub21pdCh1bmlxdWVfY3VyYXRlZF9kYXRhc2V0X2FuZF90b29sc1ssYygxLDM6NiwxMywxNCwyMSwyNCwyNSldKSxhZXMoeD1uZXdfdW5pdG9mYW5hbHlzaXMsZmlsbD1tZWFzdXJlLCBjb2xvcj1tZWFzdXJlLCBhbHBoYT1GcmVxX3RvcGljcykpICsgCiAgZ2VvbV9iYXIoc3RhdD0nY291bnQnLCBhZXMoeD1uZXdfdW5pdG9mYW5hbHlzaXMsZmlsbD1tZWFzdXJlLCBjb2xvcj1tZWFzdXJlLCBhbHBoYT1GcmVxX3RvcGljcykpKwogICMgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjODM4QjhCIiwgIiNDMUNEQ0QiLCAiI0YwRTY4QyIsICIjRkY4QzAwIiwgIiMxODc0Q0QiLCAiIzAwQkZGRiIsICIjNDU4Qjc0IiwgIiM2NkNEQUEiLCAiI0I0RUVCNCIsICIjOEI3MzU1IiwgIiNDREFBN0QiLCAiI0ZGRDM5QiIsICIjRjVGNURDIikpKwogICMgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM4MzhCOEIiLCAiI0MxQ0RDRCIsICIjRjBFNjhDIiwgIiNGRjhDMDAiLCAiIzE4NzRDRCIsICIjMDBCRkZGIiwgIiM0NThCNzQiLCAiIzY2Q0RBQSIsICIjQjRFRUI0IiwgIiM4QjczNTUiLCAiI0NEQUE3RCIsICIjRkZEMzlCIiwgIiNGNUY1REMiKSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKGMoIiM2NkNEQUEiLCAiIzY0OTVFRCIsICIjRjA4MDgwIikpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzY2Q0RBQSIsICIjNjQ5NUVEIiwgIiNGMDgwODAiKSkrCiAgY29vcmRfZmxpcCgpKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTYpKSsKICB0aGVtZShheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT0xMCkpKwogIGZhY2V0X3dyYXAoZ3JvdXB+bWVhc3VyZSkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCnVuaXF1ZV9jdXJhdGVkX2RhdGFzZXRfYW5kX3Rvb2xzJEFMTF95ZWFyPC1hcy5mYWN0b3IodW5pcXVlX2N1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHMkQUxMX3llYXIpCmdncGxvdChuYS5vbWl0KHVuaXF1ZV9jdXJhdGVkX2RhdGFzZXRfYW5kX3Rvb2xzWyxjKDEsMzo2LDEzLDE0LDIxLDI0LDI1KV0pLGFlcyh4PW5ld191bml0b2ZhbmFseXNpcyxmaWxsPUFMTF95ZWFyLCBjb2xvcj1BTExfeWVhcikpICsgCiAgZ2VvbV9iYXIoc3RhdD0nY291bnQnLCBhZXMoeD1uZXdfdW5pdG9mYW5hbHlzaXMsZmlsbD1BTExfeWVhciwgY29sb3I9QUxMX3llYXIpKSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNDMUZGQzEiLCAiI0I0RUVCNCIsICIjOUJDRDlCIiwgIiM4RkJDOEYiLCAiIzY5OEI2OSIsICIjNkU4QjNEIiwgIiM1NTZCMkYiKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiNDMUZGQzEiLCAiI0I0RUVCNCIsICIjOUJDRDlCIiwgIiM4RkJDOEYiLCAiIzY5OEI2OSIsICIjNkU4QjNEIiwgIiM1NTZCMkYiKSkrCiAgY29vcmRfZmxpcCgpKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTYpKSsKICB0aGVtZShheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT0xMCkpKwogIGZhY2V0X3dyYXAofm1lYXN1cmUpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCmBgYAoKYGBge3IgdW5pdCBvZiBhbmFseXNpcyBCWSBtZWFzdXJlIEFORCBZRUFSfQojIyMjIGJhcnBsb3RzIAojIyMjIHRvcGljIFggbWVhc3VyZSBBTkQgdW5pdE9mQW5hbGlzeXMKIyMjIyBVTklRVUUgQ09VTlRSSUVTCnVuaXF1ZV9jdXJhdGVkX2RhdGFzZXRfYW5kX3Rvb2xzPC1jdXJhdGVkX2RhdGFzZXRfYW5kX3Rvb2xzICU+JSAKICBmaWx0ZXIoLiwgdW5pcXVlX2NvdW50cnk9PSJ1bmlxdWUiKSAlPiUKICBmaWx0ZXIoLiwgdG9vbCE9Ik5vIikgJT4lCiAgZmlsdGVyKC4sIG5ld191bml0b2ZhbmFseXNpcyE9Ik5vIikgJT4lCiAgZmlsdGVyKC4sIG1lYXN1cmUhPSJEaWFnbm9zdGljIEFjY3VyYWN5IikgJT4lCiAgZmlsdGVyKC4sIG1lYXN1cmUhPSJCTUogQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIikgJT4lCiAgZmlsdGVyKC4sIG1lYXN1cmUhPSJDRUJNIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIpICU+JQogIGZpbHRlciguLCBtZWFzdXJlIT0iSkJJIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIpICU+JQogIGZpbHRlciguLCBtZWFzdXJlIT0iU0lHTi4uLlNJR04uNTAgQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIikKCnVuaXF1ZV9jdXJhdGVkX2RhdGFzZXRfYW5kX3Rvb2xzPC11bmlxdWVfY3VyYXRlZF9kYXRhc2V0X2FuZF90b29scyAlPiUKICBtdXRhdGUobmV3X3VuaXRvZmFuYWx5c2lzID0gZmN0X3JlbGV2ZWwobmV3X3VuaXRvZmFuYWx5c2lzLCAiQ3JpdGljYWwgQXBwcmFpc2FsIG9mIENsaW5pY2FsIFByYWN0aWNlIEd1aWRlbGluZXMiLCAiQ3JpdGljYWwgQXBwcmFpc2FsIG9mIFN5c3RlbWF0aWMgUmV2aWV3cyIsICJEaWFnbm9zdGljIEFjY3VyYWN5IFN0dWRpZXMiLCJFY29ub21pYyBFdmFsdWF0aW9uIFN0dWRpZXMiLCJIZWFsdGggZWR1Y2F0aW9uIGFuZCBoZWFsdGggYmVoYXZpb3IgcmVzZWFyY2ggc3R1ZGllcyIsICJSQ1RzIiwgIk5vbi1SQ1RzIGFuZCBPYnNlcnZhdGlvbmFsIFN0dWRpZXMiLCAiUkNUcyBhbmQgT2JzZXJ2YXRpb25hbCBTdHVkaWVzIiwgIlF1YW50aXRhdGl2ZSBSZXNlYXJjaCAoUHVibGljIEhlYWx0aCBSZXNlYXJjaCkiLCAiUXVhbGl0YXRpdmUgcmVzZWFyY2ggc3R1ZGllcyIsICJQYXRpZW50LVJlcG9ydGVkIE91dGNvbWUgTWVhc3VyZXMgU3R1ZGllcyIsICJNaXhlZCBtZXRob2RzIHN0dWRpZXMiLCAiTWVkaWNhbCBlZHVjYXRpb24iLCJCTUogQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIiAsIkNFQk0gQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIiwiSkJJIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIsIlNJR04uLi5TSUdOLjUwIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIpKQoKZ2dwbG90KG5hLm9taXQodW5pcXVlX2N1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHNbLGMoMSwzOjYsMTMsMTQsMjEsMjQsMjUpXSksYWVzKHg9YXMuZmFjdG9yKEFMTF95ZWFyKSxmaWxsPW5ld191bml0b2ZhbmFseXNpcywgY29sb3I9bmV3X3VuaXRvZmFuYWx5c2lzLCBhbHBoYT1GcmVxX3RvcGljcykpICsgCiAgZ2VvbV9iYXIoc3RhdD0nY291bnQnLCBhZXMoeD1hcy5mYWN0b3IoQUxMX3llYXIpLGZpbGw9bmV3X3VuaXRvZmFuYWx5c2lzLCBjb2xvcj1uZXdfdW5pdG9mYW5hbHlzaXMsIGFscGhhPUZyZXFfdG9waWNzKSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjODM4QjhCIiwgIiNDMUNEQ0QiLCAiI0YwRTY4QyIsICIjRkY4QzAwIiwgIiMxODc0Q0QiLCAiIzAwQkZGRiIsICIjNDU4Qjc0IiwgIiM2NkNEQUEiLCAiI0I0RUVCNCIsICIjOEI3MzU1IiwgIiNDREFBN0QiLCAiI0ZGRDM5QiIsICIjRjVGNURDIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjODM4QjhCIiwgIiNDMUNEQ0QiLCAiI0YwRTY4QyIsICIjRkY4QzAwIiwgIiMxODc0Q0QiLCAiIzAwQkZGRiIsICIjNDU4Qjc0IiwgIiM2NkNEQUEiLCAiI0I0RUVCNCIsICIjOEI3MzU1IiwgIiNDREFBN0QiLCAiI0ZGRDM5QiIsICIjRjVGNURDIikpKwogICNjb29yZF9mbGlwKCkrCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9NikpKwogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTYpKSsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGMoIjIwMTEiLCAiMjAxMiIsICIyMDEzIiwgIjIwMTQiLCAiMjAxNSIsICIyMDE2IiwgIjIwMTciKSkrCiAgZmFjZXRfd3JhcCh+bWVhc3VyZSkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCgojIyMjIENPTExBQk9SQVRJVkUgQ09VTlRSSUVTCiMgdW5pcXVlX2N1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHM8LWN1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHMgJT4lIApjb2xsYWJvcmF0aXZlX2N1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHM8LWN1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHMgJT4lIAogIGZpbHRlcihzdHJfZGV0ZWN0KFBST1NQRVJPX2NvdW50cnksICcsJykpICU+JQogIGZpbHRlciguLCB0b29sIT0iTm8iKSAlPiUKICBmaWx0ZXIoLiwgbmV3X3VuaXRvZmFuYWx5c2lzIT0iTm8iKSAlPiUKICBmaWx0ZXIoLiwgbWVhc3VyZSE9IkRpYWdub3N0aWMgQWNjdXJhY3kiKSAlPiUKICBmaWx0ZXIoLiwgbWVhc3VyZSE9IkJNSiBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiKSAlPiUKICBmaWx0ZXIoLiwgbWVhc3VyZSE9IkNFQk0gQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIikgJT4lCiAgZmlsdGVyKC4sIG1lYXN1cmUhPSJKQkkgQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIikgJT4lCiAgZmlsdGVyKC4sIG1lYXN1cmUhPSJTSUdOLi4uU0lHTi41MCBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiKQoKY29sbGFib3JhdGl2ZV9jdXJhdGVkX2RhdGFzZXRfYW5kX3Rvb2xzPC1jb2xsYWJvcmF0aXZlX2N1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHMgJT4lCiAgbXV0YXRlKG5ld191bml0b2ZhbmFseXNpcyA9IGZjdF9yZWxldmVsKG5ld191bml0b2ZhbmFseXNpcywgIkNyaXRpY2FsIEFwcHJhaXNhbCBvZiBDbGluaWNhbCBQcmFjdGljZSBHdWlkZWxpbmVzIiwgIkNyaXRpY2FsIEFwcHJhaXNhbCBvZiBTeXN0ZW1hdGljIFJldmlld3MiLCAiRGlhZ25vc3RpYyBBY2N1cmFjeSBTdHVkaWVzIiwiRWNvbm9taWMgRXZhbHVhdGlvbiBTdHVkaWVzIiwiSGVhbHRoIGVkdWNhdGlvbiBhbmQgaGVhbHRoIGJlaGF2aW9yIHJlc2VhcmNoIHN0dWRpZXMiLCAiUkNUcyIsICJOb24tUkNUcyBhbmQgT2JzZXJ2YXRpb25hbCBTdHVkaWVzIiwgIlJDVHMgYW5kIE9ic2VydmF0aW9uYWwgU3R1ZGllcyIsICJRdWFudGl0YXRpdmUgUmVzZWFyY2ggKFB1YmxpYyBIZWFsdGggUmVzZWFyY2gpIiwgIlF1YWxpdGF0aXZlIHJlc2VhcmNoIHN0dWRpZXMiLCAiUGF0aWVudC1SZXBvcnRlZCBPdXRjb21lIE1lYXN1cmVzIFN0dWRpZXMiLCAiTWl4ZWQgbWV0aG9kcyBzdHVkaWVzIiwgIk1lZGljYWwgZWR1Y2F0aW9uIiwiQk1KIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIgLCJDRUJNIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIsIkpCSSBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiLCJTSUdOLi4uU0lHTi41MCBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiKSkKCgpnZ3Bsb3QobmEub21pdChjb2xsYWJvcmF0aXZlX2N1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHNbLGMoMSwzOjYsMTMsMTQsMjEsMjQsMjUpXSksYWVzKHg9YXMuZmFjdG9yKEFMTF95ZWFyKSxmaWxsPW5ld191bml0b2ZhbmFseXNpcywgY29sb3I9bmV3X3VuaXRvZmFuYWx5c2lzLCBhbHBoYT1GcmVxX3RvcGljcykpICsgCiAgZ2VvbV9iYXIoc3RhdD0nY291bnQnLCBhZXMoeD1hcy5mYWN0b3IoQUxMX3llYXIpLGZpbGw9bmV3X3VuaXRvZmFuYWx5c2lzLCBjb2xvcj1uZXdfdW5pdG9mYW5hbHlzaXMsIGFscGhhPUZyZXFfdG9waWNzKSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjODM4QjhCIiwgIiNDMUNEQ0QiLCAiI0YwRTY4QyIsICIjRkY4QzAwIiwgIiMxODc0Q0QiLCAiIzAwQkZGRiIsICIjNDU4Qjc0IiwgIiM2NkNEQUEiLCAiI0I0RUVCNCIsICIjOEI3MzU1IiwgIiNDREFBN0QiLCAiI0ZGRDM5QiIsICIjRjVGNURDIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjODM4QjhCIiwgIiNDMUNEQ0QiLCAiI0YwRTY4QyIsICIjRkY4QzAwIiwgIiMxODc0Q0QiLCAiIzAwQkZGRiIsICIjNDU4Qjc0IiwgIiM2NkNEQUEiLCAiI0I0RUVCNCIsICIjOEI3MzU1IiwgIiNDREFBN0QiLCAiI0ZGRDM5QiIsICIjRjVGNURDIikpKwogICNjb29yZF9mbGlwKCkrCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9NikpKwogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTYpKSsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGMoIjIwMTEiLCAiMjAxMiIsICIyMDEzIiwgIjIwMTQiLCAiMjAxNSIsICIyMDE2IiwgIjIwMTciKSkrCiAgZmFjZXRfd3JhcCh+bWVhc3VyZSkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCmBgYAoKYGBge3IgdW5pdCBvZiBhbmFseXNpcyBCWSBtZWFzdXJlIEFORCBncm91cH0KIyMjIyBiYXJwbG90cyAKIyMjIyB0b3BpYyBYIG1lYXN1cmUgQU5EIHVuaXRPZkFuYWxpc3lzCiMjIyMgVU5JUVVFIENPVU5UUklFUwp1bmlxdWVfY3VyYXRlZF9kYXRhc2V0X2FuZF90b29sczwtY3VyYXRlZF9kYXRhc2V0X2FuZF90b29scyAlPiUgCiAgZmlsdGVyKC4sIHVuaXF1ZV9jb3VudHJ5PT0idW5pcXVlIikgJT4lCiAgZmlsdGVyKC4sIHRvb2whPSJObyIpICU+JQogIGZpbHRlciguLCBuZXdfdW5pdG9mYW5hbHlzaXMhPSJObyIpICU+JQogIGZpbHRlciguLCBtZWFzdXJlIT0iRGlhZ25vc3RpYyBBY2N1cmFjeSIpICU+JQogIGZpbHRlciguLCBtZWFzdXJlIT0iQk1KIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIpICU+JQogIGZpbHRlciguLCBtZWFzdXJlIT0iQ0VCTSBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiKSAlPiUKICBmaWx0ZXIoLiwgbWVhc3VyZSE9IkpCSSBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiKSAlPiUKICBmaWx0ZXIoLiwgbWVhc3VyZSE9IlNJR04uLi5TSUdOLjUwIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIpCgp1bmlxdWVfY3VyYXRlZF9kYXRhc2V0X2FuZF90b29sczwtdW5pcXVlX2N1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHMgJT4lCiAgbXV0YXRlKG5ld191bml0b2ZhbmFseXNpcyA9IGZjdF9yZWxldmVsKG5ld191bml0b2ZhbmFseXNpcywgIkNyaXRpY2FsIEFwcHJhaXNhbCBvZiBDbGluaWNhbCBQcmFjdGljZSBHdWlkZWxpbmVzIiwgIkNyaXRpY2FsIEFwcHJhaXNhbCBvZiBTeXN0ZW1hdGljIFJldmlld3MiLCAiRGlhZ25vc3RpYyBBY2N1cmFjeSBTdHVkaWVzIiwiRWNvbm9taWMgRXZhbHVhdGlvbiBTdHVkaWVzIiwiSGVhbHRoIGVkdWNhdGlvbiBhbmQgaGVhbHRoIGJlaGF2aW9yIHJlc2VhcmNoIHN0dWRpZXMiLCAiUkNUcyIsICJOb24tUkNUcyBhbmQgT2JzZXJ2YXRpb25hbCBTdHVkaWVzIiwgIlJDVHMgYW5kIE9ic2VydmF0aW9uYWwgU3R1ZGllcyIsICJRdWFudGl0YXRpdmUgUmVzZWFyY2ggKFB1YmxpYyBIZWFsdGggUmVzZWFyY2gpIiwgIlF1YWxpdGF0aXZlIHJlc2VhcmNoIHN0dWRpZXMiLCAiUGF0aWVudC1SZXBvcnRlZCBPdXRjb21lIE1lYXN1cmVzIFN0dWRpZXMiLCAiTWl4ZWQgbWV0aG9kcyBzdHVkaWVzIiwgIk1lZGljYWwgZWR1Y2F0aW9uIiwiQk1KIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIgLCJDRUJNIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIsIkpCSSBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiLCJTSUdOLi4uU0lHTi41MCBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiKSkKCmdncGxvdChuYS5vbWl0KHVuaXF1ZV9jdXJhdGVkX2RhdGFzZXRfYW5kX3Rvb2xzWyxjKDEsMzo2LDEzLDE0LDIxLDI0LDI1KV0pLGFlcyh4PW1lYXN1cmUsZmlsbD1uZXdfdW5pdG9mYW5hbHlzaXMsIGNvbG9yPW5ld191bml0b2ZhbmFseXNpcywgYWxwaGE9RnJlcV90b3BpY3MpKSArIAogIGdlb21fYmFyKHN0YXQ9J2NvdW50JywgYWVzKHg9bWVhc3VyZSxmaWxsPW5ld191bml0b2ZhbmFseXNpcywgY29sb3I9bmV3X3VuaXRvZmFuYWx5c2lzLCBhbHBoYT1GcmVxX3RvcGljcykpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiIzgzOEI4QiIsICIjQzFDRENEIiwgIiNGMEU2OEMiLCAiI0ZGOEMwMCIsICIjMTg3NENEIiwgIiMwMEJGRkYiLCAiIzQ1OEI3NCIsICIjNjZDREFBIiwgIiNCNEVFQjQiLCAiIzhCNzM1NSIsICIjQ0RBQTdEIiwgIiNGRkQzOUIiLCAiI0Y1RjVEQyIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzgzOEI4QiIsICIjQzFDRENEIiwgIiNGMEU2OEMiLCAiI0ZGOEMwMCIsICIjMTg3NENEIiwgIiMwMEJGRkYiLCAiIzQ1OEI3NCIsICIjNjZDREFBIiwgIiNCNEVFQjQiLCAiIzhCNzM1NSIsICIjQ0RBQTdEIiwgIiNGRkQzOUIiLCAiI0Y1RjVEQyIpKSsKICAjY29vcmRfZmxpcCgpKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTYpKSsKICB0aGVtZShheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT02KSkrCiAgZmFjZXRfd3JhcCh+Z3JvdXApKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgoKIyMjIyBDT0xMQUJPUkFUSVZFIENPVU5UUklFUwojIHVuaXF1ZV9jdXJhdGVkX2RhdGFzZXRfYW5kX3Rvb2xzPC1jdXJhdGVkX2RhdGFzZXRfYW5kX3Rvb2xzICU+JSAKY29sbGFib3JhdGl2ZV9jdXJhdGVkX2RhdGFzZXRfYW5kX3Rvb2xzPC1jdXJhdGVkX2RhdGFzZXRfYW5kX3Rvb2xzICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChQUk9TUEVST19jb3VudHJ5LCAnLCcpKSAlPiUKICBmaWx0ZXIoLiwgdG9vbCE9Ik5vIikgJT4lCiAgZmlsdGVyKC4sIG5ld191bml0b2ZhbmFseXNpcyE9Ik5vIikgJT4lCiAgZmlsdGVyKC4sIG1lYXN1cmUhPSJEaWFnbm9zdGljIEFjY3VyYWN5IikgJT4lCiAgZmlsdGVyKC4sIG1lYXN1cmUhPSJCTUogQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIikgJT4lCiAgZmlsdGVyKC4sIG1lYXN1cmUhPSJDRUJNIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIpICU+JQogIGZpbHRlciguLCBtZWFzdXJlIT0iSkJJIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIpICU+JQogIGZpbHRlciguLCBtZWFzdXJlIT0iU0lHTi4uLlNJR04uNTAgQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIikKCmNvbGxhYm9yYXRpdmVfY3VyYXRlZF9kYXRhc2V0X2FuZF90b29sczwtY29sbGFib3JhdGl2ZV9jdXJhdGVkX2RhdGFzZXRfYW5kX3Rvb2xzICU+JQogIG11dGF0ZShuZXdfdW5pdG9mYW5hbHlzaXMgPSBmY3RfcmVsZXZlbChuZXdfdW5pdG9mYW5hbHlzaXMsICJDcml0aWNhbCBBcHByYWlzYWwgb2YgQ2xpbmljYWwgUHJhY3RpY2UgR3VpZGVsaW5lcyIsICJDcml0aWNhbCBBcHByYWlzYWwgb2YgU3lzdGVtYXRpYyBSZXZpZXdzIiwgIkRpYWdub3N0aWMgQWNjdXJhY3kgU3R1ZGllcyIsIkVjb25vbWljIEV2YWx1YXRpb24gU3R1ZGllcyIsIkhlYWx0aCBlZHVjYXRpb24gYW5kIGhlYWx0aCBiZWhhdmlvciByZXNlYXJjaCBzdHVkaWVzIiwgIlJDVHMiLCAiTm9uLVJDVHMgYW5kIE9ic2VydmF0aW9uYWwgU3R1ZGllcyIsICJSQ1RzIGFuZCBPYnNlcnZhdGlvbmFsIFN0dWRpZXMiLCAiUXVhbnRpdGF0aXZlIFJlc2VhcmNoIChQdWJsaWMgSGVhbHRoIFJlc2VhcmNoKSIsICJRdWFsaXRhdGl2ZSByZXNlYXJjaCBzdHVkaWVzIiwgIlBhdGllbnQtUmVwb3J0ZWQgT3V0Y29tZSBNZWFzdXJlcyBTdHVkaWVzIiwgIk1peGVkIG1ldGhvZHMgc3R1ZGllcyIsICJNZWRpY2FsIGVkdWNhdGlvbiIsIkJNSiBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiICwiQ0VCTSBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiLCJKQkkgQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIiwiU0lHTi4uLlNJR04uNTAgQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIikpCgoKZ2dwbG90KG5hLm9taXQoY29sbGFib3JhdGl2ZV9jdXJhdGVkX2RhdGFzZXRfYW5kX3Rvb2xzWyxjKDEsMzo2LDEzLDE0LDIxLDI0LDI1KV0pLGFlcyh4PWFzLmZhY3RvcihBTExfeWVhciksZmlsbD1uZXdfdW5pdG9mYW5hbHlzaXMsIGNvbG9yPW5ld191bml0b2ZhbmFseXNpcywgYWxwaGE9RnJlcV90b3BpY3MpKSArIAogIGdlb21fYmFyKHN0YXQ9J2NvdW50JywgYWVzKHg9YXMuZmFjdG9yKEFMTF95ZWFyKSxmaWxsPW5ld191bml0b2ZhbmFseXNpcywgY29sb3I9bmV3X3VuaXRvZmFuYWx5c2lzLCBhbHBoYT1GcmVxX3RvcGljcykpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiIzgzOEI4QiIsICIjQzFDRENEIiwgIiNGMEU2OEMiLCAiI0ZGOEMwMCIsICIjMTg3NENEIiwgIiMwMEJGRkYiLCAiIzQ1OEI3NCIsICIjNjZDREFBIiwgIiNCNEVFQjQiLCAiIzhCNzM1NSIsICIjQ0RBQTdEIiwgIiNGRkQzOUIiLCAiI0Y1RjVEQyIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzgzOEI4QiIsICIjQzFDRENEIiwgIiNGMEU2OEMiLCAiI0ZGOEMwMCIsICIjMTg3NENEIiwgIiMwMEJGRkYiLCAiIzQ1OEI3NCIsICIjNjZDREFBIiwgIiNCNEVFQjQiLCAiIzhCNzM1NSIsICIjQ0RBQTdEIiwgIiNGRkQzOUIiLCAiI0Y1RjVEQyIpKSsKICAjY29vcmRfZmxpcCgpKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTYpKSsKICB0aGVtZShheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT02KSkrCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBjKCIyMDExIiwgIjIwMTIiLCAiMjAxMyIsICIyMDE0IiwgIjIwMTUiLCAiMjAxNiIsICIyMDE3IikpKwogIGZhY2V0X3dyYXAofm1lYXN1cmUpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpgYGAKCmBgYHtyfQojIyMjIFVOSVFVRQojIyMjIGJhcnBsb3RzIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scwp1bmlxdWVfY3VyYXRlZF9kYXRhc2V0X2FuZF90b29sczwtY3VyYXRlZF9kYXRhc2V0X2FuZF90b29scyAlPiUgCiAgZmlsdGVyKC4sIHVuaXF1ZV9jb3VudHJ5PT0idW5pcXVlIikgJT4lCiAgZmlsdGVyKC4sIHRvb2whPSJObyIpICU+JQogIGZpbHRlciguLCBuZXdfdW5pdG9mYW5hbHlzaXMhPSJObyIpICU+JQogIGZpbHRlciguLCBtZWFzdXJlIT0iRGlhZ25vc3RpYyBBY2N1cmFjeSIpICU+JQogIGZpbHRlciguLCBtZWFzdXJlIT0iTm8iKSAlPiUKICBmaWx0ZXIoLiwgbWVhc3VyZSE9IlJlcG9ydGluZyIpICU+JQogIGZpbHRlciguLCBtZWFzdXJlIT0iUXVhbGl0eSIpICU+JQogIGZpbHRlciguLCBtZWFzdXJlIT0iUm9CIikgJT4lCiAgZmlsdGVyKC4sIChtZWFzdXJlPT0iQk1KIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIgfCBtZWFzdXJlPT0iQ0VCTSBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiIHxtZWFzdXJlPT0iSkJJIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scyIgfG1lYXN1cmU9PSJTSUdOLi4uU0lHTi41MCBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiICkpCgp1bmlxdWVfY3VyYXRlZF9kYXRhc2V0X2FuZF90b29sczwtdW5pcXVlX2N1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHMgJT4lCiAgbXV0YXRlKG5ld191bml0b2ZhbmFseXNpcyA9IGZjdF9yZWxldmVsKG5ld191bml0b2ZhbmFseXNpcywgIkJNSiBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiICwiQ0VCTSBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiLCJKQkkgQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIiwiU0lHTi4uLlNJR04uNTAgQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIikKCmdncGxvdChuYS5vbWl0KHVuaXF1ZV9jdXJhdGVkX2RhdGFzZXRfYW5kX3Rvb2xzWyxjKDEsMzo2LDEzLDE0LDIxLDI0LDI1KV0pLGFlcyh4PVRvcGljc19nZW5lcmFsLGZpbGw9bmV3X3VuaXRvZmFuYWx5c2lzLCBjb2xvcj1uZXdfdW5pdG9mYW5hbHlzaXMsIGFscGhhPUZyZXFfdG9waWNzKSkgKyAKICBnZW9tX2JhcihzdGF0PSdjb3VudCcsIGFlcyh4PVRvcGljc19nZW5lcmFsLGZpbGw9bmV3X3VuaXRvZmFuYWx5c2lzLCBjb2xvcj1uZXdfdW5pdG9mYW5hbHlzaXMsIGFscGhhPUZyZXFfdG9waWNzKSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjODM4QjhCIiwgIiNDMUNEQ0QiLCAiI0YwRTY4QyIsICIjRkY4QzAwIiwgIiMxODc0Q0QiLCAiIzAwQkZGRiIsICIjNDU4Qjc0IiwgIiM2NkNEQUEiLCAiI0I0RUVCNCIsICIjOEI3MzU1IiwgIiNDREFBN0QiLCAiI0ZGRDM5QiIsICIjRjVGNURDIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjODM4QjhCIiwgIiNDMUNEQ0QiLCAiI0YwRTY4QyIsICIjRkY4QzAwIiwgIiMxODc0Q0QiLCAiIzAwQkZGRiIsICIjNDU4Qjc0IiwgIiM2NkNEQUEiLCAiI0I0RUVCNCIsICIjOEI3MzU1IiwgIiNDREFBN0QiLCAiI0ZGRDM5QiIsICIjRjVGNURDIikpKwogIGNvb3JkX2ZsaXAoKSsKICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT02KSkrCiAgdGhlbWUoYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MTApKSsKICBmYWNldF93cmFwKH5tZWFzdXJlKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQoKCmdncGxvdChuYS5vbWl0KHVuaXF1ZV9jdXJhdGVkX2RhdGFzZXRfYW5kX3Rvb2xzWyxjKDEsMzo2LDEzLDE0LDIxLDI0LDI1KV0pLGFlcyh4PVRvcGljc19nZW5lcmFsLGZpbGw9bWVhc3VyZSwgY29sb3I9bWVhc3VyZSwgYWxwaGE9RnJlcV90b3BpY3MpKSArIAogIGdlb21fYmFyKHN0YXQ9J2NvdW50JywgYWVzKHg9VG9waWNzX2dlbmVyYWwsZmlsbD1tZWFzdXJlLCBjb2xvcj1tZWFzdXJlLCBhbHBoYT1GcmVxX3RvcGljcykpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiIzgzOEI4QiIsICIjQzFDRENEIiwgIiNGMEU2OEMiLCAiI0ZGOEMwMCIsICIjMTg3NENEIiwgIiMwMEJGRkYiLCAiIzQ1OEI3NCIsICIjNjZDREFBIiwgIiNCNEVFQjQiLCAiIzhCNzM1NSIsICIjQ0RBQTdEIiwgIiNGRkQzOUIiLCAiI0Y1RjVEQyIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzgzOEI4QiIsICIjQzFDRENEIiwgIiNGMEU2OEMiLCAiI0ZGOEMwMCIsICIjMTg3NENEIiwgIiMwMEJGRkYiLCAiIzQ1OEI3NCIsICIjNjZDREFBIiwgIiNCNEVFQjQiLCAiIzhCNzM1NSIsICIjQ0RBQTdEIiwgIiNGRkQzOUIiLCAiI0Y1RjVEQyIpKSsKICBjb29yZF9mbGlwKCkrCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9NikpKwogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTEwKSkrCiAgZmFjZXRfd3JhcCh+dW5pcXVlX2NvbnRpbmVudCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKYGBgCgoKYGBge3J9CiMjIyMgQ09MTEFCT1JBVElWRQojIyMjIGJhcnBsb3RzIENyaXRpY2FsIEFwcHJhaXNhbCBUb29scwpjb2xsYWJvcmF0aXZlX2N1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHM8LWN1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHMgJT4lIAogIGZpbHRlcihzdHJfZGV0ZWN0KFBST1NQRVJPX2NvdW50cnksICcsJykpICU+JQogIGZpbHRlciguLCB0b29sIT0iTm8iKSAlPiUKICBmaWx0ZXIoLiwgbmV3X3VuaXRvZmFuYWx5c2lzIT0iTm8iKSAlPiUKICBmaWx0ZXIoLiwgbWVhc3VyZSE9IkRpYWdub3N0aWMgQWNjdXJhY3kiKSAlPiUKICBmaWx0ZXIoLiwgbWVhc3VyZSE9Ik5vIikgJT4lCiAgZmlsdGVyKC4sIG1lYXN1cmUhPSJSZXBvcnRpbmciKSAlPiUKICBmaWx0ZXIoLiwgbWVhc3VyZSE9IlF1YWxpdHkiKSAlPiUKICBmaWx0ZXIoLiwgbWVhc3VyZSE9IlJvQiIpICU+JQogIGZpbHRlciguLCAobWVhc3VyZT09IkJNSiBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiIHwgbWVhc3VyZT09IkNFQk0gQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIiB8bWVhc3VyZT09IkpCSSBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiIHxtZWFzdXJlPT0iU0lHTi4uLlNJR04uNTAgQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIiApKQoKY29sbGFib3JhdGl2ZV9jdXJhdGVkX2RhdGFzZXRfYW5kX3Rvb2xzPC1jb2xsYWJvcmF0aXZlX2N1cmF0ZWRfZGF0YXNldF9hbmRfdG9vbHMgJT4lCiAgbXV0YXRlKG5ld191bml0b2ZhbmFseXNpcyA9IGZjdF9yZWxldmVsKG5ld191bml0b2ZhbmFseXNpcywgIkJNSiBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiICwiQ0VCTSBDcml0aWNhbCBBcHByYWlzYWwgVG9vbHMiLCJKQkkgQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIiwiU0lHTi4uLlNJR04uNTAgQ3JpdGljYWwgQXBwcmFpc2FsIFRvb2xzIikKCmdncGxvdChuYS5vbWl0KGNvbGxhYm9yYXRpdmVfY3VyYXRlZF9kYXRhc2V0X2FuZF90b29sc1ssYygxLDM6NiwxMywxNCwyMSwyNCwyNSldKSxhZXMoeD1Ub3BpY3NfZ2VuZXJhbCxmaWxsPW5ld191bml0b2ZhbmFseXNpcywgY29sb3I9bmV3X3VuaXRvZmFuYWx5c2lzLCBhbHBoYT1GcmVxX3RvcGljcykpICsgCiAgZ2VvbV9iYXIoc3RhdD0nY291bnQnLCBhZXMoeD1Ub3BpY3NfZ2VuZXJhbCxmaWxsPW5ld191bml0b2ZhbmFseXNpcywgY29sb3I9bmV3X3VuaXRvZmFuYWx5c2lzLCBhbHBoYT1GcmVxX3RvcGljcykpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiIzgzOEI4QiIsICIjQzFDRENEIiwgIiNGMEU2OEMiLCAiI0ZGOEMwMCIsICIjMTg3NENEIiwgIiMwMEJGRkYiLCAiIzQ1OEI3NCIsICIjNjZDREFBIiwgIiNCNEVFQjQiLCAiIzhCNzM1NSIsICIjQ0RBQTdEIiwgIiNGRkQzOUIiLCAiI0Y1RjVEQyIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzgzOEI4QiIsICIjQzFDRENEIiwgIiNGMEU2OEMiLCAiI0ZGOEMwMCIsICIjMTg3NENEIiwgIiMwMEJGRkYiLCAiIzQ1OEI3NCIsICIjNjZDREFBIiwgIiNCNEVFQjQiLCAiIzhCNzM1NSIsICIjQ0RBQTdEIiwgIiNGRkQzOUIiLCAiI0Y1RjVEQyIpKSsKICBjb29yZF9mbGlwKCkrCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9NikpKwogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTEwKSkrCiAgZmFjZXRfd3JhcCh+dW5pcXVlX2NvbnRpbmVudCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCgpnZ3Bsb3QobmEub21pdCh1bmlxdWVfY3VyYXRlZF9kYXRhc2V0X2FuZF90b29sc1ssYygxLDM6NiwxMywxNCwyMSwyNCwyNSldKSxhZXMoeD1Ub3BpY3NfZ2VuZXJhbCxmaWxsPW1lYXN1cmUsIGNvbG9yPW1lYXN1cmUsIGFscGhhPUZyZXFfdG9waWNzKSkgKyAKICBnZW9tX2JhcihzdGF0PSdjb3VudCcsIGFlcyh4PVRvcGljc19nZW5lcmFsLGZpbGw9bWVhc3VyZSwgY29sb3I9bWVhc3VyZSwgYWxwaGE9RnJlcV90b3BpY3MpKSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiM4MzhCOEIiLCAiI0MxQ0RDRCIsICIjRjBFNjhDIiwgIiNGRjhDMDAiLCAiIzE4NzRDRCIsICIjMDBCRkZGIiwgIiM0NThCNzQiLCAiIzY2Q0RBQSIsICIjQjRFRUI0IiwgIiM4QjczNTUiLCAiI0NEQUE3RCIsICIjRkZEMzlCIiwgIiNGNUY1REMiKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM4MzhCOEIiLCAiI0MxQ0RDRCIsICIjRjBFNjhDIiwgIiNGRjhDMDAiLCAiIzE4NzRDRCIsICIjMDBCRkZGIiwgIiM0NThCNzQiLCAiIzY2Q0RBQSIsICIjQjRFRUI0IiwgIiM4QjczNTUiLCAiI0NEQUE3RCIsICIjRkZEMzlCIiwgIiNGNUY1REMiKSkrCiAgY29vcmRfZmxpcCgpKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTYpKSsKICB0aGVtZShheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT0xMCkpKwogIGZhY2V0X3dyYXAofnVuaXF1ZV9jb250aW5lbnQpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCmBgYAoKYGBge3J9Cm5hbWVzKGRhdGFzZXRfUFJPU1BFUk8yX2ZpbmFsKQp1bmlxdWVfY3VyYXRlZF9kYXRhc2V0PC1jdXJhdGVkX2RhdGFzZXQgJT4lIAogIGZpbHRlciguLCB1bmlxdWVfY291bnRyeT09InVuaXF1ZSIpCmdncGxvdChuYS5vbWl0KHVuaXF1ZV9jdXJhdGVkX2RhdGFzZXRbLGMoNCwxMiw3MCw3MSldKSxhZXMoeD1Ub3BpY3NfZ2VuZXJhbCxmaWxsPUFNU1RBUikpICsgCiAgZ2VvbV9iYXIoc3RhdD0nY291bnQnLGFlcyh4PVRvcGljc19nZW5lcmFsLGZpbGw9QU1TVEFSKSkrCiAgY29vcmRfZmxpcCgpKwogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTQpKSsKICBmYWNldF93cmFwKH51bmlxdWVfY29udGluZW50KSsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQpgYGAKCmBgYHtyfQojIyMjICBQTE9UUwojIGxpYnJhcnkoImdnaGlnaGxpZ2h0IikKY3VyYXRlZF9kYXRhc2V0X29yZGVyIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoY3VyYXRlZF9kYXRhc2V0WyxjKDQpXSkpCmN1cmF0ZWRfZGF0YXNldF9vcmRlcl9maW5hbDwtbWVyZ2UoY3VyYXRlZF9kYXRhc2V0LCBjdXJhdGVkX2RhdGFzZXRfb3JkZXIsIGJ5Lng9IlRvcGljc19nZW5lcmFsIiwgYnkueSA9ICJWYXIxIiwgYWxsLnggPSBUUlVFKQpjdXJhdGVkX2RhdGFzZXRfb3JkZXJfZmluYWw8LWFycmFuZ2UoY3VyYXRlZF9kYXRhc2V0X29yZGVyX2ZpbmFsLGRlc2MoRnJlcSkpCmZpbmFsX29yZGVyPC1jdXJhdGVkX2RhdGFzZXRfb3JkZXJfZmluYWxbb3JkZXIoY3VyYXRlZF9kYXRhc2V0X29yZGVyX2ZpbmFsJEZyZXEpLGMoMSw2NCw3MildCm5ld2RhdGEgPC0gY3VyYXRlZF9kYXRhc2V0X29yZGVyX2ZpbmFsW29yZGVyKC1jdXJhdGVkX2RhdGFzZXRfb3JkZXJfZmluYWwkRnJlcSksXSAKCmdncGxvdChuYS5vbWl0KG5ld2RhdGEpLGFlcyh4PUFMTF95ZWFyLGNvbG9yPVRvcGljc19nZW5lcmFsKSkgKyAKICBnZW9tX3BvaW50KHN0YXQgPSAnY291bnQnKSArCiAgZ2VvbV9saW5lKHN0YXQ9J2NvdW50JyxhZXMoeD1BTExfeWVhcixjb2xvcj1Ub3BpY3NfZ2VuZXJhbCkpKwogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTQpKSsKICBmYWNldF93cmFwKH5Ub3BpY3NfZ2VuZXJhbCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgeGxhYigiWWVhciIpICsKICB5bGFiKCJuwrogcHJvdG9jb2xzIikrCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDIwMTEsIDIwMTcpLCBicmVha3MgPSBjKDIwMTEsMjAxMiwyMDEzLDIwMTQsMjAxNSwyMDE2LDIwMTcpKQoKICAjIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygyMDExLCAyMDE3KSwgYnJlYWtzID0gYygyMDExLDIwMTIsMjAxMywyMDE0LDIwMTUsMjAxNiwyMDE3KSkrCiAgIyB4bGFiKCJZZWFyIikgKwogICMgeWxhYigibsK6IHByb3RvY29scyIpKwogICMgZ2d0aXRsZSgiU1JzIHByb3RvY29scyBieSBqb3VybmFsIikKCmdncGxvdChjdXJhdGVkX2RhdGFzZXQsYWVzKHg9QUxMX3llYXIsY29sb3I9bWV0aG9kb2xvZ2ljYWwucXVhbGl0eSkpICsgCiAgZ2VvbV9wb2ludChzdGF0ID0gJ2NvdW50JykgKwogIGdlb21fbGluZShzdGF0PSdjb3VudCcsYWVzKHg9QUxMX3llYXIsY29sb3I9bWV0aG9kb2xvZ2ljYWwucXVhbGl0eSkpKwogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTQpKSsKICBmYWNldF93cmFwKH5tZXRob2RvbG9naWNhbC5xdWFsaXR5KSsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSsKICB4bGFiKCJZZWFyIikgKwogIHlsYWIoIm7CuiBwcm90b2NvbHMiKQoKZ2dwbG90KGN1cmF0ZWRfZGF0YXNldCxhZXMoeD1BTExfeWVhcixjb2xvcj1xdWFsaXR5Lm9mLnN0dWRpZXMpKSArIAogIGdlb21fcG9pbnQoc3RhdCA9ICdjb3VudCcpICsKICBnZW9tX2xpbmUoc3RhdD0nY291bnQnLGFlcyh4PUFMTF95ZWFyLGNvbG9yPXF1YWxpdHkub2Yuc3R1ZGllcykpKwogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTQpKSsKICBmYWNldF93cmFwKH5xdWFsaXR5Lm9mLnN0dWRpZXMpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpnZ3Bsb3QoY3VyYXRlZF9kYXRhc2V0LGFlcyh4PUFMTF95ZWFyLGNvbG9yPXJpc2sub2YuYmlhcykpICsgCiAgZ2VvbV9wb2ludChzdGF0ID0gJ2NvdW50JykgKwogIGdlb21fbGluZShzdGF0PSdjb3VudCcsYWVzKHg9QUxMX3llYXIsY29sb3I9cmlzay5vZi5iaWFzKSkrCiAgdGhlbWUoYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9NCkpKwogIGZhY2V0X3dyYXAofnJpc2sub2YuYmlhcykrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCmdncGxvdChjdXJhdGVkX2RhdGFzZXQsYWVzKHg9QUxMX3llYXIsY29sb3I9dHdvX3Jldmlld2Vyc19PUl90d29fYXV0aG9ycykpICsgCiAgZ2VvbV9wb2ludChzdGF0ID0gJ2NvdW50JykgKwogIGdlb21fbGluZShzdGF0PSdjb3VudCcsYWVzKHg9QUxMX3llYXIsY29sb3I9dHdvX3Jldmlld2Vyc19PUl90d29fYXV0aG9ycykpKwogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTQpKSsKICBmYWNldF93cmFwKH50d29fcmV2aWV3ZXJzX09SX3R3b19hdXRob3JzKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQoKZ2dwbG90KGN1cmF0ZWRfZGF0YXNldCxhZXMoeD1BTExfeWVhcixjb2xvcj1Sb0JfZmllbGRfaW5mb3JtYXRpb24pKSArIAogIGdlb21fcG9pbnQoc3RhdCA9ICdjb3VudCcpICsKICBnZW9tX2xpbmUoc3RhdD0nY291bnQnLGFlcyh4PUFMTF95ZWFyLGNvbG9yPVJvQl9maWVsZF9pbmZvcm1hdGlvbikpKwogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTQpKSsKICBmYWNldF93cmFwKH5Sb0JfZmllbGRfaW5mb3JtYXRpb24pKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgp1bmlxdWVfY3VyYXRlZF9kYXRhc2V0PC1jdXJhdGVkX2RhdGFzZXQgJT4lIGZpbHRlciguLCB1bmlxdWVfY291bnRyeT09InVuaXF1ZSIpCmdncGxvdCh1bmlxdWVfY3VyYXRlZF9kYXRhc2V0LGFlcyh4PVRvcGljc19nZW5lcmFsLGNvbG9yPVBST1NQRVJPX2NvdW50cnkpKSArIAogIGdlb21fYmFyKHN0YXQ9J2NvdW50JyxhZXMoeD1Ub3BpY3NfZ2VuZXJhbCxjb2xvcj1QUk9TUEVST19jb3VudHJ5KSkrCiAgY29vcmRfZmxpcCgpKwogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTQpKSsKICBmYWNldF93cmFwKH5QUk9TUEVST19jb3VudHJ5KSsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQoKIyMjICB0b3BpY3MgQlkgY291bnRyaWVzIGNvbG9yZWQgQlkgY29udGluZW50CnVuaXF1ZV9jdXJhdGVkX2RhdGFzZXQ8LWN1cmF0ZWRfZGF0YXNldCAlPiUgZmlsdGVyKC4sIHVuaXF1ZV9jb3VudHJ5PT0idW5pcXVlIikKZ2dwbG90KHVuaXF1ZV9jdXJhdGVkX2RhdGFzZXQsYWVzKHg9VG9waWNzX2dlbmVyYWwsY29sb3I9dW5pcXVlX2NvbnRpbmVudCkpICsgCiAgZ2VvbV9iYXIoc3RhdD0nY291bnQnLGFlcyh4PVRvcGljc19nZW5lcmFsLGNvbG9yPXVuaXF1ZV9jb250aW5lbnQpKSsKICBjb29yZF9mbGlwKCkrCiAgdGhlbWUoYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9NCkpKwogIGZhY2V0X3dyYXAoflBST1NQRVJPX2NvdW50cnkpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgoKIyMjICB0b3BpY3MgQlkgY29udGluZW50IGNvbG9yZWQgQlkgY29udGluZW50CnVuaXF1ZV9jdXJhdGVkX2RhdGFzZXQ8LWN1cmF0ZWRfZGF0YXNldCAlPiUgCiAgZmlsdGVyKC4sIHVuaXF1ZV9jb3VudHJ5PT0idW5pcXVlIikKZ2dwbG90KG5hLm9taXQodW5pcXVlX2N1cmF0ZWRfZGF0YXNldFssYyg0LDcwLDcxKV0pLGFlcyh4PVRvcGljc19nZW5lcmFsLGNvbG9yPXVuaXF1ZV9jb250aW5lbnQpKSArIAogIGdlb21fYmFyKHN0YXQ9J2NvdW50JyxhZXMoeD1Ub3BpY3NfZ2VuZXJhbCxjb2xvcj11bmlxdWVfY29udGluZW50KSkrCiAgY29vcmRfZmxpcCgpKwogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTQpKSsKICBmYWNldF93cmFwKH51bmlxdWVfY29udGluZW50KSsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQpgYGAKCmBgYHtyfQojIyMgcmFuayBjb21hcmUgYmV0d2VlbiBjb250aW5lbnRzCm15X3RoZW1lIDwtIGZ1bmN0aW9uKCkgewogIAogICMgQ29sb3JzCiAgY29sb3IuYmFja2dyb3VuZCA9ICJ3aGl0ZSIKICBjb2xvci50ZXh0ID0gIiMyMjIxMWQiCiAgCiAgIyBCZWdpbiBjb25zdHJ1Y3Rpb24gb2YgY2hhcnQKICB0aGVtZV9idyhiYXNlX3NpemU9MTUpICsKICAgIAogICAgIyBGb3JtYXQgYmFja2dyb3VuZCBjb2xvcnMKICAgIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD1jb2xvci5iYWNrZ3JvdW5kLCBjb2xvcj1jb2xvci5iYWNrZ3JvdW5kKSkgKwogICAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kICA9IGVsZW1lbnRfcmVjdChmaWxsPWNvbG9yLmJhY2tncm91bmQsIGNvbG9yPWNvbG9yLmJhY2tncm91bmQpKSArCiAgICB0aGVtZShwYW5lbC5ib3JkZXIgICAgID0gZWxlbWVudF9yZWN0KGNvbG9yPWNvbG9yLmJhY2tncm91bmQpKSArCiAgICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9Y29sb3IuYmFja2dyb3VuZCwgY29sb3I9Y29sb3IuYmFja2dyb3VuZCkpICsKICAgIAogICAgIyBGb3JtYXQgdGhlIGdyaWQKICAgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogICAgdGhlbWUocGFuZWwuZ3JpZC5taW5vci55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgICB0aGVtZShheGlzLnRpY2tzICAgICAgID0gZWxlbWVudF9ibGFuaygpKSArCiAgICAKICAgICMgRm9ybWF0IHRoZSBsZWdlbmQKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgCiAgICAjIEZvcm1hdCB0aXRsZSBhbmQgYXhpcyBsYWJlbHMKICAgIHRoZW1lKHBsb3QudGl0bGUgICAgICAgPSBlbGVtZW50X3RleHQoY29sb3I9Y29sb3IudGV4dCwgc2l6ZT0yMCwgZmFjZSA9ICJib2xkIikpICsKICAgIHRoZW1lKGF4aXMudGl0bGUueCAgICAgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgY29sb3I9ImJsYWNrIiwgZmFjZSA9ICJib2xkIikpICsKICAgIHRoZW1lKGF4aXMudGl0bGUueSAgICAgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgY29sb3I9ImJsYWNrIiwgZmFjZSA9ICJib2xkIiwgdmp1c3Q9MS4yNSkpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ICAgICAgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCwgdmp1c3Q9MC41LCBoanVzdD0wLjUsIGNvbG9yID0gY29sb3IudGV4dCkpICsKICAgIHRoZW1lKGF4aXMudGV4dC55ICAgICAgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCwgY29sb3IgPSBjb2xvci50ZXh0KSkgKwogICAgdGhlbWUoc3RyaXAudGV4dCAgICAgICA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSkgKwogICAgCiAgICAjIFBsb3QgbWFyZ2lucwogICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMC4zNSwgMC4yLCAwLjMsIDAuMzUpLCAiY20iKSkKfQpsYWJlbHM8LWFzLnZlY3RvcihsZXZlbHMocmFua19kYXRhJGRpc2Vhc2UpKQpyYW5rX2NvbXBhcmU8LXJlYWQuY3N2MihmaWxlPSJyYW5rX2NvbXBhcmUuY3N2IikKcmFua19kYXRhIDwtIHJhbmtfY29tcGFyZSAlPiUgZ2F0aGVyKGNvbnRpbmVudCxSYW5rLC1kaXNlYXNlKQpnZ3Bsb3RDb2xvcnMgPC0gZnVuY3Rpb24oZyl7CiAgZCA8LSAzNjAvZwogIGggPC0gY3Vtc3VtKGMoMTUsIHJlcChkLGcgLSAxKSkpCiAgaGNsKGggPSBoLCBjID0gMTAwLCBsID0gNjUpCn0KCmBgYAoKYGBge3J9CgojZ3JlcCgiYmx1ZSIsY29sb3JzKCkpCiMgIFRPUDEwIEV1cm9wZSAKZ2dwbG90KGRhdGEgPSByYW5rX2RhdGEsIGFlcyh4ID0gY29udGluZW50LCB5ID0gUmFuaywgZ3JvdXAgPSBkaXNlYXNlKSkgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBkaXNlYXNlLCBhbHBoYSA9IDEpLCBzaXplID0gMSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gZGlzZWFzZSwgYWxwaGEgPSAxKSwgc2l6ZSA9IDIpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoOCwyLDIsOCw4LDgsOCwyLDgsOCw4LDIsOCw4LDgsMiw4LDgsMiw4LDgsOCwyLDgsOCwyLDgsOCwyLDgsOCw4LDgsMiw4KSkrCiAgc2NhbGVfeF9kaXNjcmV0ZShleHBhbmQgPSBjKDAuODUsMCksIGxpbWl0cyA9IGMoIkV1cm9wZSIsIkFtZXJpY2EiLCJBc2lhIiwiU291dGguQXNpYS5hbmQuT2NlYW5pYSIsIkFmcmljYSIpKSsKICBzY2FsZV95X3JldmVyc2UoYnJlYWtzID0gMTozNSkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIiIsCiAgICAgICB0aXRsZSA9ICJwcm90b2NvbHMgZm9yIFNScyBieSB0b3BpYyBcbmNvbXBhcmluZyByYW5raW5ncyBieSBjb250aW5lbnQiKSArCiAgbXlfdGhlbWUoKSArIAogIGdlb21fdGV4dChkYXRhID1yYW5rX2RhdGEsYWVzKHk9UmFuayx4PTAuNixsYWJlbD1jKCIiKSxoanVzdD0icmlnaHQiKSkKYGBgCgpgYGB7cn0KCiMgIFRPUDEwIEFtZXJpY2EKZ2dwbG90KGRhdGEgPSByYW5rX2RhdGEsIGFlcyh4ID0gY29udGluZW50LCB5ID0gUmFuaywgZ3JvdXAgPSBkaXNlYXNlKSkgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBkaXNlYXNlLCBhbHBoYSA9IDEpLCBzaXplID0gMSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gZGlzZWFzZSwgYWxwaGEgPSAxKSwgc2l6ZSA9IDIpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoOCwxLDEsOCw4LDgsOCwxLDgsOCw4LDEsOCw4LDgsMSw4LDgsMSw4LDQsOCwxLDgsOCwxLDgsOCwxLDgsOCw4LDgsMSw4KSkrCiAgc2NhbGVfeF9kaXNjcmV0ZShleHBhbmQgPSBjKDAuODUsMCksIGxpbWl0cyA9IGMoIkV1cm9wZSIsIkFtZXJpY2EiLCJBc2lhIiwiU291dGguQXNpYS5hbmQuT2NlYW5pYSIsIkFmcmljYSIpKSsKICBzY2FsZV95X3JldmVyc2UoYnJlYWtzID0gMTozNSkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIiIsCiAgICAgICB0aXRsZSA9ICJwcm90b2NvbHMgZm9yIFNScyBieSB0b3BpYyBcbmNvbXBhcmluZyByYW5raW5ncyBieSBjb250aW5lbnQiKSArCiAgbXlfdGhlbWUoKSArIAogIGdlb21fdGV4dChkYXRhID1yYW5rX2RhdGEsYWVzKHk9UmFuayx4PTAuNixsYWJlbD1jKCIiKSxoanVzdD0icmlnaHQiKSkKYGBgCgpgYGB7cn0KCiMgIFRPUDEwIEFzaWEKZ2dwbG90KGRhdGEgPSByYW5rX2RhdGEsIGFlcyh4ID0gY29udGluZW50LCB5ID0gUmFuaywgZ3JvdXAgPSBkaXNlYXNlKSkgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBkaXNlYXNlLCBhbHBoYSA9IDEpLCBzaXplID0gMSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gZGlzZWFzZSwgYWxwaGEgPSAxKSwgc2l6ZSA9IDIpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoMywxLDEsOCw4LDgsOCwxLDgsOCw4LDEsOCw4LDgsMSw4LDMsMSw4LDMsOCwxLDgsOCwxLDgsOCwxLDgsOCw4LDgsMSw4KSkrCiAgc2NhbGVfeF9kaXNjcmV0ZShleHBhbmQgPSBjKDAuODUsMCksIGxpbWl0cyA9IGMoIkV1cm9wZSIsIkFtZXJpY2EiLCJBc2lhIiwiU291dGguQXNpYS5hbmQuT2NlYW5pYSIsIkFmcmljYSIpKSsKICBzY2FsZV95X3JldmVyc2UoYnJlYWtzID0gMTozNSkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIiIsCiAgICAgICB0aXRsZSA9ICJwcm90b2NvbHMgZm9yIFNScyBieSB0b3BpYyBcbmNvbXBhcmluZyByYW5raW5ncyBieSBjb250aW5lbnQiKSArCiAgbXlfdGhlbWUoKSArIAogIGdlb21fdGV4dChkYXRhID1yYW5rX2RhdGEsYWVzKHk9UmFuayx4PTAuNixsYWJlbD1jKCIiKSxoanVzdD0icmlnaHQiKSkKCmBgYAoKYGBge3J9CgojICBUT1AxMCBPY2VhbmlhCmdncGxvdChkYXRhID0gcmFua19kYXRhLCBhZXMoeCA9IGNvbnRpbmVudCwgeSA9IFJhbmssIGdyb3VwID0gZGlzZWFzZSkpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGlzZWFzZSwgYWxwaGEgPSAxKSwgc2l6ZSA9IDEpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRpc2Vhc2UsIGFscGhhID0gMSksIHNpemUgPSAyKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKDgsMSwxLDgsOCw4LDgsMSw4LDgsOCwxLDgsOCw4LDEsOCw4LDEsOCw4LDgsMSw4LDgsMSw4LDgsMSw4LDgsOCw4LDEsOCkpKwogIHNjYWxlX3hfZGlzY3JldGUoZXhwYW5kID0gYygwLjg1LDApLCBsaW1pdHMgPSBjKCJFdXJvcGUiLCJBbWVyaWNhIiwiQXNpYSIsIlNvdXRoLkFzaWEuYW5kLk9jZWFuaWEiLCJBZnJpY2EiKSkrCiAgc2NhbGVfeV9yZXZlcnNlKGJyZWFrcyA9IDE6MzUpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnMoeCA9ICIiLAogICAgICAgeSA9ICIiLAogICAgICAgdGl0bGUgPSAicHJvdG9jb2xzIGZvciBTUnMgYnkgdG9waWMgXG5jb21wYXJpbmcgcmFua2luZ3MgYnkgY29udGluZW50IikgKwogIG15X3RoZW1lKCkgKyAKICBnZW9tX3RleHQoZGF0YSA9cmFua19kYXRhLGFlcyh5PVJhbmsseD0wLjYsbGFiZWw9YygiIiksaGp1c3Q9InJpZ2h0IikpCmBgYAoKYGBge3J9CiMgIFRPUDEwIEFmcmljYQpnZ3Bsb3QoZGF0YSA9IHJhbmtfZGF0YSwgYWVzKHggPSBjb250aW5lbnQsIHkgPSBSYW5rLCBncm91cCA9IGRpc2Vhc2UpKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRpc2Vhc2UsIGFscGhhID0gMSksIHNpemUgPSAxKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBkaXNlYXNlLCBhbHBoYSA9IDEpLCBzaXplID0gMikgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYyg4LDEsMSw4LDgsOCw4LDEsOCw4LDgsMSw4LDgsOCwxLDgsOCwxLDgsMTUsOCwxLDgsOCwxLDgsOCwxLDgsOCw4LDgsMSw4KSkrCiAgc2NhbGVfeF9kaXNjcmV0ZShleHBhbmQgPSBjKDAuODUsMCksIGxpbWl0cyA9IGMoIkV1cm9wZSIsIkFtZXJpY2EiLCJBc2lhIiwiU291dGguQXNpYS5hbmQuT2NlYW5pYSIsIkFmcmljYSIpKSsKICBzY2FsZV95X3JldmVyc2UoYnJlYWtzID0gMTozNSkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIiIsCiAgICAgICB0aXRsZSA9ICJwcm90b2NvbHMgZm9yIFNScyBieSB0b3BpYyBcbmNvbXBhcmluZyByYW5raW5ncyBieSBjb250aW5lbnQiKSArCiAgbXlfdGhlbWUoKSArIAogIGdlb21fdGV4dChkYXRhID1yYW5rX2RhdGEsYWVzKHk9UmFuayx4PTAuNixsYWJlbD1jKCIiKSxoanVzdD0icmlnaHQiKSkKYGBgCgoKCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDbWQrT3B0aW9uK0kqLgoKV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDbWQrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4gCgpUaGUgcHJldmlldyBzaG93cyB5b3UgYSByZW5kZXJlZCBIVE1MIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IuIENvbnNlcXVlbnRseSwgdW5saWtlICpLbml0KiwgKlByZXZpZXcqIGRvZXMgbm90IHJ1biBhbnkgUiBjb2RlIGNodW5rcy4gSW5zdGVhZCwgdGhlIG91dHB1dCBvZiB0aGUgY2h1bmsgd2hlbiBpdCB3YXMgbGFzdCBydW4gaW4gdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuCgo=